Mozilla/mozilla/cmd/xfe/src/EditorView.cpp
kin%netscape.com 34850048ef Initial check-in of HTMLArea (embedded composer widget) form
element feature. All Ender related code is ifdef'd ENDER.


git-svn-id: svn://10.0.0.236/trunk@7379 18797224-902f-48f8-a5cc-f745e15eee43
1998-08-05 19:08:58 +00:00

3301 lines
87 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
EditorView.cpp -- class definition for the editor view class
Created: Richard Hess <rhess@netscape.com>, 11-Nov-96
*/
#include "rosetta.h"
#include "EditorFrame.h"
#include "EditorView.h"
#include "SpellHandler.h"
#include <Xm/Label.h>
#include <Xfe/Xfe.h>
#include "xpgetstr.h"
#include "fe_proto.h"
#include "edt.h"
#include "xeditor.h"
#ifndef NO_SECURITY
#include "pk11func.h"
#endif
extern "C" int XFE_EDITOR_NEWTABLE_COLS;
#define FE_SYNTAX_ERROR() doSyntaxErrorAlert(view, info)
//
// This acts as an encapsulator for the doCommand() method.
// Sub-classes impliment a reallyDoCommand(), and leave the
// boring maintainence work to this class. This approach
// saves every sub-class from calling super::doCommand(),
// which would really be a drag, now wouldn't it.
//
class XFE_EditorViewCommand : public XFE_ViewCommand
{
public:
XFE_EditorViewCommand(char* name) : XFE_ViewCommand(name) {};
virtual void reallyDoCommand(XFE_View*, XFE_CommandInfo*) = 0;
virtual XP_Bool requiresChromeUpdate() {
return TRUE;
};
void doCommand(XFE_View* v_view, XFE_CommandInfo* info) {
XFE_EditorView* view = (XFE_EditorView*)v_view;
reallyDoCommand(view, info);
if (requiresChromeUpdate()) {
view->updateChrome();
}
};
};
class UndoCommand : public XFE_EditorViewCommand
{
public:
UndoCommand() : XFE_EditorViewCommand(xfeCmdUndo) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanUndo(view->getContext(), NULL);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorUndo(view->getContext());
};
char* getLabel(XFE_View* view, XFE_CommandInfo*) {
#if EDITOR_UNDO
char* label;
fe_EditorCanUndo(view->getContext(), (unsigned char **)&label);
return label;
#else
//
// Well, in the new world order none of the stuff that I
// used to use for Undo works any more, so until we fix it...
//
Widget top = view->getToplevel()->getBaseWidget();
return XfeSubResourceGetStringValue(top,
"undo",
"UndoItem",
XmNlabelString,
XmCLabelString,
NULL);
#endif
};
};
class RedoCommand : public XFE_EditorViewCommand
{
public:
RedoCommand() : XFE_EditorViewCommand(xfeCmdRedo) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanRedo(view->getContext(), NULL);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorRedo(view->getContext());
};
char* getLabel(XFE_View* view, XFE_CommandInfo*) {
#if EDITOR_UNDO
char* label;
fe_EditorCanRedo(view->getContext(), (unsigned char **)&label);
return label;
#else
// See above.
Widget top = view->getToplevel()->getBaseWidget();
return XfeSubResourceGetStringValue(top,
"redo",
"UndoItem",
XmNlabelString,
XmCLabelString,
NULL);
#endif
};
};
class CutCommand : public XFE_EditorViewCommand
{
public:
CutCommand() : XFE_EditorViewCommand(xfeCmdCut) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanCut(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
fe_EditorCut(view->getContext(), fe_GetTimeFromEvent(info->event));
};
};
class CopyCommand : public XFE_EditorViewCommand
{
public:
CopyCommand() : XFE_EditorViewCommand(xfeCmdCopy) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanCopy(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata);
};
void CopyCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
fe_EditorCopy(view->getContext(), fe_GetTimeFromEvent(info->event));
};
class PasteCommand : public XFE_EditorViewCommand
{
public:
PasteCommand() : XFE_EditorViewCommand(xfeCmdPaste) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo* info) {
XP_Bool rv = FALSE;
if (info != NULL && *info->nparams > 0) {
if (XP_STRCASECMP(info->params[0], "clipboard") == 0) {
rv = fe_EditorCanPaste(view->getContext());
} else if (XP_STRCASECMP(info->params[0], "selection") == 0) {
rv = TRUE; // lazy, but this would be a real performance hit
} else {
FE_SYNTAX_ERROR();
}
} else {
rv = fe_EditorCanPaste(view->getContext());
}
return rv;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
Boolean from_selection = FALSE;
MWContext* context = view->getContext();
if (info != NULL) {
Time now = fe_GetTimeFromEvent(info->event);
if (*info->nparams > 0) {
if (XP_STRCASECMP(info->params[0], "clipboard") == 0) {
from_selection = FALSE;
} else if (XP_STRCASECMP(info->params[0], "selection") == 0) {
from_selection = TRUE;
} else {
FE_SYNTAX_ERROR();
}
}
if (from_selection) {
// NOTE... [ if it's triggered off a mouse click (Btn2),
// [ set the location before you paste...
//
if ((info->event != NULL) &&
(info->event->type == ButtonPress)) {
fe_EditorGrabFocus(context, info->event);
}
fe_EditorPastePrimarySel(context, now);
}
else
fe_EditorPaste(context, now);
}
};
};
class AlwaysEnabledCommand : public XFE_EditorViewCommand
{
public:
AlwaysEnabledCommand(char* name) : XFE_EditorViewCommand(name) {};
XP_Bool isEnabled(XFE_View*, XFE_CommandInfo*) {
return True;
};
};
class DeleteCommand : public AlwaysEnabledCommand
{
public:
DeleteCommand() : AlwaysEnabledCommand(xfeCmdDeleteItem) {};
virtual XP_Bool isSlow() {
return FALSE;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
Boolean previous = FALSE;
if (info != NULL && *info->nparams > 0) {
char* param = info->params[0];
if (XP_STRCASECMP(param, "next") == 0)
previous = FALSE;
else if (XP_STRCASECMP(param, "previous") == 0)
previous = TRUE;
else if (XP_STRCASECMP(param, "endOfLine") == 0) {
EDT_EndOfLine(view->getContext(), True);
}
else {
FE_SYNTAX_ERROR();
}
}
fe_EditorDeleteItem(view->getContext(), previous);
};
};
class SpellCommand : public XFE_EditorViewCommand
{
public:
SpellCommand() : XFE_EditorViewCommand(xfeCmdSpellCheck) {};
XP_Bool isDynamic() { return TRUE; };
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return xfe_SpellCheckerAvailable(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
xfe_EditorSpellCheck(view->getContext());
};
};
class SaveCommand : public AlwaysEnabledCommand
{
public:
SaveCommand() : AlwaysEnabledCommand(xfeCmdSave) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorSave(view->getContext());
};
};
class SaveAsCommand : public AlwaysEnabledCommand
{
public:
SaveAsCommand() : AlwaysEnabledCommand(xfeCmdSaveAs) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorSaveAs(view->getContext());
};
};
class PublishCommand : public AlwaysEnabledCommand
{
public:
PublishCommand() : AlwaysEnabledCommand(xfeCmdPublish) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorPublish(view->getContext());
};
};
class DeleteTableCommand : public XFE_EditorViewCommand
{
public:
DeleteTableCommand() : XFE_EditorViewCommand(xfeCmdDeleteTable) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableCanDelete(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableDelete(view->getContext());
};
};
class DeleteTableCellCommand : public XFE_EditorViewCommand
{
public:
DeleteTableCellCommand() : XFE_EditorViewCommand(xfeCmdDeleteTableCell) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableCellCanDelete(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableCellDelete(view->getContext());
};
};
class DeleteTableRowCommand : public XFE_EditorViewCommand
{
public:
DeleteTableRowCommand() : XFE_EditorViewCommand(xfeCmdDeleteTableRow) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableRowCanDelete(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableRowDelete(view->getContext());
};
};
class DeleteTableColumnCommand : public XFE_EditorViewCommand
{
public:
DeleteTableColumnCommand() : XFE_EditorViewCommand(xfeCmdDeleteTableColumn) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableColumnCanDelete(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableColumnDelete(view->getContext());
};
};
class RemoveLinkCommand : public XFE_EditorViewCommand
{
public:
RemoveLinkCommand() : XFE_EditorViewCommand(xfeCmdRemoveLink) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanRemoveLinks(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorRemoveLinks(view->getContext());
};
};
class SelectAllCommand : public AlwaysEnabledCommand
{
public:
SelectAllCommand() : AlwaysEnabledCommand(xfeCmdSelectAll) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorSelectAll(view->getContext());
};
};
class FindCommand : public AlwaysEnabledCommand
{
public:
FindCommand() : AlwaysEnabledCommand(xfeCmdFindInObject) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorFind(view->getContext());
};
};
class FindAgainCommand : public XFE_EditorViewCommand
{
public:
FindAgainCommand() : XFE_EditorViewCommand(xfeCmdFindAgain) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorCanFindAgain(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorFindAgain(view->getContext());
};
};
static char*
get_show_hide_label(Widget widget, char* root, Boolean show)
{
char* prefix;
char name[256];
if (show)
prefix = "show";
else
prefix = "hide";
XP_STRCPY(name, prefix);
if (root != NULL)
XP_STRCAT(name, root);
return XfeSubResourceGetStringValue(widget,
name,
XfeClassNameForWidget(widget),
XmNlabelString,
XmCLabelString,
NULL);
}
class ToggleParagraphMarksCommand : public AlwaysEnabledCommand
{
public:
ToggleParagraphMarksCommand() :
AlwaysEnabledCommand(xfeCmdToggleParagraphMarks) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorParagraphMarksGetState(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
Boolean set = fe_EditorParagraphMarksGetState(context);
fe_EditorParagraphMarksSetState(context, !set);
};
char* getLabel(XFE_View* view, XFE_CommandInfo* info) {
char* string = NULL;
if (info != NULL) {
MWContext* context = view->getContext();
Boolean set = fe_EditorParagraphMarksGetState(context);
string = get_show_hide_label(info->widget, "ParagraphMarks", !set);
}
return string;
};
};
class ToggleTableBordersCommand : public AlwaysEnabledCommand
{
public:
ToggleTableBordersCommand() :
AlwaysEnabledCommand(xfeCmdToggleTableBorders) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorDisplayTablesGet(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
Boolean set = fe_EditorDisplayTablesGet(context);
fe_EditorDisplayTablesSet(context, !set);
};
};
class ReloadCommand : public AlwaysEnabledCommand
{
public:
ReloadCommand() : AlwaysEnabledCommand(xfeCmdReload) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return !EDT_IS_NEW_DOCUMENT(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
Boolean do_super = (info != NULL &&
*info->nparams > 0 &&
XP_STRCASECMP(info->params[0], "super") == 0);
fe_EditorReload(view->getContext(), do_super);
};
};
class RefreshCommand : public AlwaysEnabledCommand
{
public:
RefreshCommand() : AlwaysEnabledCommand(xfeCmdRefresh) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorRefresh(view->getContext());
};
};
class InsertLinkCommand : public AlwaysEnabledCommand
{
public:
InsertLinkCommand() : AlwaysEnabledCommand(xfeCmdInsertLink) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorInsertLinkDialogDo(view->getContext());
};
};
class InsertTargetCommand : public AlwaysEnabledCommand
{
public:
InsertTargetCommand() : AlwaysEnabledCommand(xfeCmdInsertTarget) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTargetPropertiesDialogDo(view->getContext());
};
};
class InsertImageCommand : public AlwaysEnabledCommand
{
public:
InsertImageCommand() : AlwaysEnabledCommand(xfeCmdInsertImage) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorPropertiesDialogDo(view->getContext(),
XFE_EDITOR_PROPERTIES_IMAGE_INSERT);
};
};
class InsertBulletedListCommand : public AlwaysEnabledCommand
{
public:
InsertBulletedListCommand() :
AlwaysEnabledCommand(xfeCmdInsertBulletedList) {};
XP_Bool isDynamic() { return TRUE; };
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorToggleList(view->getContext(), P_UNUM_LIST);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return EDT_GetToggleListState(view->getContext(), P_UNUM_LIST);
};
};
class InsertNumberedListCommand : public AlwaysEnabledCommand
{
public:
InsertNumberedListCommand() :
AlwaysEnabledCommand(xfeCmdInsertNumberedList) {};
XP_Bool isDynamic() { return TRUE; };
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorToggleList(view->getContext(), P_NUM_LIST);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return EDT_GetToggleListState(view->getContext(), P_NUM_LIST);
};
};
class InsertHorizontalLineCommand : public AlwaysEnabledCommand
{
public:
InsertHorizontalLineCommand() :
AlwaysEnabledCommand(xfeCmdInsertHorizontalLine) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
MWContext* context = view->getContext();
if (info != NULL &&
*info->nparams > 0 &&
XP_STRCASECMP(info->params[0], "dialog")) {
fe_EditorHorizontalRulePropertiesDialogDo(view->getContext());
} else {
fe_EditorInsertHorizontalRule(context);
}
};
};
class InsertTableCommand : public XFE_EditorViewCommand
{
public:
InsertTableCommand() : XFE_EditorViewCommand(xfeCmdInsertTable) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableCanInsert(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableCreateDialogDo(view->getContext());
};
};
class InsertTableRowCommand : public XFE_EditorViewCommand
{
public:
InsertTableRowCommand() : XFE_EditorViewCommand(xfeCmdInsertTableRow) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableRowCanInsert(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableRowInsert(view->getContext(), NULL);
};
};
class InsertTableColumnCommand : public XFE_EditorViewCommand
{
public:
InsertTableColumnCommand() : XFE_EditorViewCommand(xfeCmdInsertTableColumn) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableColumnCanInsert(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableColumnInsert(view->getContext(), NULL);
};
};
class InsertTableCellCommand : public XFE_EditorViewCommand
{
public:
InsertTableCellCommand() : XFE_EditorViewCommand(xfeCmdInsertTableCell) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableCellCanInsert(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTableCellInsert(view->getContext(), NULL);
};
};
class SelectTableCommand : public XFE_EditorViewCommand
{
public:
SelectTableCommand() : XFE_EditorViewCommand(xfeCmdSelectTable) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ChangeTableSelection(view->getContext(), ED_HIT_SEL_TABLE,
ED_MOVE_NONE,
EDT_GetTableCellData(view->getContext()));
};
};
class SelectTableCellCommand : public XFE_EditorViewCommand
{
public:
SelectTableCellCommand() : XFE_EditorViewCommand(xfeCmdSelectTableCell) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ChangeTableSelection(view->getContext(), ED_HIT_SEL_CELL,
ED_MOVE_NONE,
EDT_GetTableCellData(view->getContext()));
};
};
class SelectTableRowCommand : public XFE_EditorViewCommand
{
public:
SelectTableRowCommand() : XFE_EditorViewCommand(xfeCmdSelectTableRow) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ChangeTableSelection(view->getContext(), ED_HIT_SEL_ROW,
ED_MOVE_NONE,
EDT_GetTableCellData(view->getContext()));
};
};
class SelectTableColumnCommand : public XFE_EditorViewCommand
{
public:
SelectTableColumnCommand()
: XFE_EditorViewCommand(xfeCmdSelectTableColumn) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ChangeTableSelection(view->getContext(), ED_HIT_SEL_COL,
ED_MOVE_NONE,
EDT_GetTableCellData(view->getContext()));
};
};
class SelectTableAllCellsCommand : public XFE_EditorViewCommand
{
public:
SelectTableAllCellsCommand()
: XFE_EditorViewCommand(xfeCmdSelectTableAllCells) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ChangeTableSelection(view->getContext(), ED_HIT_SEL_ALL_CELLS,
ED_MOVE_NONE,
EDT_GetTableCellData(view->getContext()));
};
};
class TableJoinCommand : public XFE_EditorViewCommand
{
public:
TableJoinCommand()
: XFE_EditorViewCommand(xfeCmdTableJoin) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_GetMergeTableCellsType(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_MergeTableCells(view->getContext());
};
};
class ConvertTextToTableCommand : public XFE_EditorViewCommand
{
public:
ConvertTextToTableCommand()
: XFE_EditorViewCommand(xfeCmdConvertTextToTable) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return EDT_CanConvertTextToTable(view->getContext());
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
char* cols_str = XFE_Prompt(view->getContext(),
XP_GetString(XFE_EDITOR_NEWTABLE_COLS),
"1");
int cols = atoi(cols_str);
if (cols <= 0)
return;
EDT_ConvertTextToTable(view->getContext(), cols);
};
};
class ConvertTableToTextCommand : public XFE_EditorViewCommand
{
public:
ConvertTableToTextCommand()
: XFE_EditorViewCommand(xfeCmdConvertTableToText) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return (EDT_IsInsertPointInTable(view->getContext()) != 0);
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_ConvertTableToText(view->getContext());
};
};
class InsertHtmlCommand : public AlwaysEnabledCommand
{
public:
InsertHtmlCommand() : AlwaysEnabledCommand(xfeCmdInsertHtml) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorHtmlPropertiesDialogDo(view->getContext());
};
};
class InsertBreakBelowImageCommand : public AlwaysEnabledCommand
{
public:
InsertBreakBelowImageCommand() :
AlwaysEnabledCommand(xfeCmdInsertBreakBelowImage) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorLineBreak(view->getContext(), ED_BREAK_BOTH);
};
};
class InsertNonBreakingSpaceCommand : public AlwaysEnabledCommand
{
public:
InsertNonBreakingSpaceCommand() :
AlwaysEnabledCommand(xfeCmdInsertNonBreakingSpace) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorNonBreakingSpace(view->getContext());
};
};
struct parse_tokens_st {
char* name;
unsigned bits;
};
static unsigned
tokens_cmp(parse_tokens_st* mapping, char* s, unsigned& bits)
{
char *p;
char *q;
int i;
unsigned nmatches = 0;
bits = 0;
s = strdup(s); /* lazy */
for (p = s; *p; ) {
q = strchr(p, '|'); /* look for or */
if (q)
*q++ = '\0'; /* punch out or */
else
q = &p[strlen(p)];
/*
* Check the token.
*/
for (i = 0; mapping[i].name != NULL; i++) {
if (strcmp(p, mapping[i].name) == 0) {
bits |= mapping[i].bits;
nmatches++;
break;
}
}
p = q;
}
/* Use first (default) value for no match */
if (nmatches == 0)
bits = mapping[0].bits;
free(s);
return nmatches;
}
static parse_tokens_st font_size_tokens[] = {
{ "default", ED_FONTSIZE_ZERO },
{ "-2", ED_FONTSIZE_MINUS_TWO },
{ "-1", ED_FONTSIZE_MINUS_ONE },
{ "0", ED_FONTSIZE_ZERO },
{ "+0", ED_FONTSIZE_ZERO },
{ "+1", ED_FONTSIZE_PLUS_ONE },
{ "+2", ED_FONTSIZE_PLUS_TWO },
{ "+3", ED_FONTSIZE_PLUS_THREE },
{ "+4", ED_FONTSIZE_PLUS_FOUR },
{ NULL }
};
static XFE_CommandParameters set_font_size_params[] = {
{ "-2", (void*)ED_FONTSIZE_MINUS_TWO },
{ "-1", (void*)ED_FONTSIZE_MINUS_ONE },
{ "+0", (void*)ED_FONTSIZE_ZERO },
{ "+1", (void*)ED_FONTSIZE_PLUS_ONE },
{ "+2", (void*)ED_FONTSIZE_PLUS_TWO },
{ "+3", (void*)ED_FONTSIZE_PLUS_THREE },
{ "+4", (void*)ED_FONTSIZE_PLUS_FOUR },
{ NULL }
};
int
XFE_CommandParametersGetIndexByName(XFE_CommandParameters* list, char* name)
{
unsigned i;
for (i = 0; list[i].name != NULL; i++) {
if (XP_STRCASECMP(name, list[i].name) == 0)
return i;
}
return -1;
}
int
XFE_CommandParametersGetIndexByData(XFE_CommandParameters* list, void* data)
{
unsigned i;
for (i = 0; list[i].name != NULL; i++) {
if (data == list[i].data)
return i;
}
return -1;
}
static Boolean
style_is_determinate(MWContext* context, ED_TextFormat foo)
{
EDT_CharacterData* edt_cdata = EDT_GetCharacterData(context);
Boolean rv = FALSE;
if (edt_cdata != NULL) {
rv = ((edt_cdata->mask & foo) != 0);
EDT_FreeCharacterData(edt_cdata);
}
return rv;
}
class SetFontSizeCommand : public AlwaysEnabledCommand
{
public:
SetFontSizeCommand() : AlwaysEnabledCommand(xfeCmdSetFontSize) {};
SetFontSizeCommand(char* name) : AlwaysEnabledCommand(name) {};
virtual XP_Bool isDynamic() { return TRUE; };
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_FONT_SIZE);
};
XP_Bool isSelected(XFE_View* view, ED_FontSize size) {
return size == fe_EditorFontSizeGet(view->getContext());
}
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo* info) {
int i;
if (info == NULL || info->params == NULL)
return FALSE;
for (i = 0; set_font_size_params[i].name != NULL; i++) {
char* name = set_font_size_params[i].name;
ED_FontSize size = (ED_FontSize)(int)set_font_size_params[i].data;
if (XP_STRCMP(name, info->params[0]) == 0) {
return isSelected(view, size);
}
}
return FALSE;
}
XFE_CommandParameters* getParameters(XFE_View*) {
return (XFE_CommandParameters*)set_font_size_params;
}
int getParameterIndex(XFE_View* view) {
MWContext* context;
ED_FontSize size;
unsigned i;
if (!isDeterminate(view, NULL))
return -1;
context = view->getContext();
size = fe_EditorFontSizeGet(context);
if (size == ED_FONTSIZE_DEFAULT)
return 2;
for (i = 0; set_font_size_params[i].name != NULL; i++) {
ED_FontSize match = (ED_FontSize)(int)set_font_size_params[i].data;
if (match == size)
return i;
}
return -1;
}
void set(XFE_View* view, ED_FontSize size = ED_FONTSIZE_ZERO) {
fe_EditorFontSizeSet(view->getContext(), size);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata) {
// FIXME
XFE_CommandInfo* info = (XFE_CommandInfo*)calldata;
ED_FontSize size = ED_FONTSIZE_ZERO; // default
if (info) {
String* params = info->params;
Cardinal nparams = *info->nparams;
unsigned foo;
if (nparams > 0) {
MWContext* context = view->getContext();
if (XP_STRCASECMP(params[0], "increase") == 0) {
size = (ED_FontSize)
((unsigned)fe_EditorFontSizeGet(context) + 1);
} else if (XP_STRCASECMP(params[0], "decrease") == 0) {
size = (ED_FontSize)
((unsigned)fe_EditorFontSizeGet(context) - 1);
} else if (tokens_cmp(font_size_tokens, params[0], foo)!=0) {
size = (ED_FontSize)foo;
} else { /* junk */
FE_SYNTAX_ERROR();
return;
}
}
set(view, size);
}
};
};
class SetFontFaceCommand : public AlwaysEnabledCommand
{
private:
XFE_CommandParameters* m_params;
public:
SetFontFaceCommand() : AlwaysEnabledCommand(xfeCmdSetFontFace) {
m_params = NULL;
}
SetFontFaceCommand(char* name) : AlwaysEnabledCommand(name) {
m_params = NULL;
}
virtual XP_Bool isDynamic() { return TRUE; };
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_FONT_FACE);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo* info) {
XP_Bool rv = FALSE;
if (info != NULL && info->params != NULL) {
XFE_CommandParameters* params = getParameters(view);
int index = XFE_CommandParametersGetIndexByName(params,
info->params[0]);
if (index == get(view))
rv = TRUE;
}
return rv;
}
char* getLabel(XFE_View*, XFE_CommandInfo* info) {
char* label = NULL;
if (info != NULL && info->params != NULL)
label = info->params[0];
return label;
};
int get(XFE_View* view) {
MWContext* context = view->getContext();
int index = EDT_GetFontFaceIndex(context);
if (ED_FONT_LOCAL == index) {
char* name = EDT_GetFontFace(context);
XFE_CommandParameters* params = getParameters(view);
index = XFE_CommandParametersGetIndexByName(params, name);
if (index == -1)
index = 0;
}
return index;
}
void set(XFE_View* view, int index) {
MWContext* context = view->getContext();
XFE_CommandParameters* params = getParameters(view);
char* name = params[index].name;
EDT_SetFontFace(context, NULL, index, name);
}
int getParameterIndex(XFE_View* view) {
return get(view);
}
XFE_CommandParameters* getParameters(XFE_View* view);
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info);
};
static unsigned
edt_list_count(char* list)
{
unsigned n;
char* p;
if (list == NULL)
return 0;
for (n = 0, p = list; *p != '\0'; p += XP_STRLEN(p) + 1, n++)
;
return n;
}
static char*
edt_list_next(char* list)
{
char* p;
if (list == NULL)
return NULL;
for (p = list; *p != '\0'; p++)
;
p++;
if (*p == '\0')
return NULL;
else
return p;
}
XFE_CommandParameters*
SetFontFaceCommand::getParameters(XFE_View*)
{
if (m_params != NULL)
return m_params;
char* faces = EDT_GetFontFaces();
if (faces == NULL)
faces = "";
unsigned n;
char* p;
for (n = 0, p = faces; *p != '\0'; p += strlen(p) + 1, n++)
;
m_params = (XFE_CommandParameters*)XP_ALLOC(sizeof(XFE_CommandParameters)
*
(edt_list_count(faces)+1));
for (p = faces, n = 0; p != NULL; p = edt_list_next(p), n++) {
m_params[n].name = XP_STRDUP(p); // probably dup.
m_params[n].data = (void*)n;
}
m_params[n].name = NULL;
return m_params;
}
void
SetFontFaceCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo* info)
{
int index = 0;
if (info != NULL && info->params != NULL) {
index = XFE_CommandParametersGetIndexByName(getParameters(view),
info->params[0]);
if (index == -1) {
FE_SYNTAX_ERROR();
return;
}
}
set(view, index);
}
class SetFontColorCommand : public AlwaysEnabledCommand
{
public:
SetFontColorCommand() : AlwaysEnabledCommand(xfeCmdSetFontColor) {
m_params = NULL;
};
virtual XP_Bool isDynamic() { return TRUE; };
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_FONT_COLOR);
};
XFE_CommandParameters* getParameters(XFE_View* view);
int getParameterIndex(XFE_View* view);
void setParameterIndex(XFE_View* view, unsigned index);
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info);
private:
XFE_CommandParameters* m_params;
};
XFE_CommandParameters*
SetFontColorCommand::getParameters(XFE_View*)
{
unsigned n;
if (m_params != NULL)
return m_params;
m_params = (XFE_CommandParameters*)XP_ALLOC(sizeof(XFE_CommandParameters)
*
(MAX_NS_COLORS+2));
m_params[0].name = NULL;
m_params[0].data = (void*)0;
LO_Color loColor;
for (n = 1; n <= MAX_NS_COLORS; n++)
{
EDT_GetNSColor(n-1, &loColor);
m_params[n].name = NULL;
m_params[n].data = (void*)RGB_TO_WORD(loColor.red, loColor.green,
loColor.blue);
}
m_params[MAX_NS_COLORS+1].name = NULL;
m_params[MAX_NS_COLORS+1].data = (void*)0;
return m_params;
}
int
SetFontColorCommand::getParameterIndex(XFE_View* view)
{
LO_Color color;
int index;
if (!isDeterminate(view, NULL))
return -1;
MWContext* context = view->getContext();
if (fe_EditorColorGet(context, &color)) {
index = EDT_GetMatchingFontColorIndex(&color);
} else {
index = 0; // default color.
}
return index;
}
void
SetFontColorCommand::setParameterIndex(XFE_View* view, unsigned index)
{
MWContext* context = view->getContext();
LO_Color color;
unsigned n;
XFE_CommandParameters* colors = getParameters(view);
if (index == 0) {
fe_EditorColorSet(context, NULL);
return;
}
//
// Use this because the stupid back-end routine takes forever
// (yes ladies and gentlemen it re-parses the colors), and
// crashes a lot.
//
for (n = 1; n < index && colors[n].name != NULL; n++)
;
if (colors[n].name != NULL) { // did not fall off end of list
unsigned long word = (unsigned long)colors[n].data;
color.red = WORD_TO_R(word);
color.green = WORD_TO_G(word);
color.blue = WORD_TO_B(word);
fe_EditorColorSet(context, &color);
}
}
void
SetFontColorCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo* info)
{
uint8 red;
uint8 green;
uint8 blue;
LO_Color color;
if (info != NULL && *info->nparams > 0) {
if (LO_ParseRGB(info->params[0], &red, &green, &blue)) {
color.red = red;
color.green = green;
color.blue = blue;
fe_EditorColorSet(view->getContext(), &color);
}
}
}
static parse_tokens_st paragraph_style_tokens[] = {
{ "normal", P_NSDT },
{ "headingOne", P_HEADER_1 },
{ "headingTwo", P_HEADER_2 },
{ "headingThree", P_HEADER_3 },
{ "headingFour", P_HEADER_4 },
{ "headingFive", P_HEADER_5 },
{ "headingSix", P_HEADER_6 },
{ "address", P_ADDRESS },
{ "formatted", P_PREFORMAT },
{ "listItem", P_LIST_ITEM },
{ "descriptionItem", P_DESC_TITLE },
{ "descriptionText", P_DESC_TEXT },
{ 0 }
};
class SetParagraphStyleCommand : public AlwaysEnabledCommand
{
public:
SetParagraphStyleCommand() :
AlwaysEnabledCommand(xfeCmdSetParagraphStyle) {};
SetParagraphStyleCommand(char* name) : AlwaysEnabledCommand(name) {};
virtual XP_Bool isDynamic() { return TRUE; };
XFE_CommandParameters* getParameters(XFE_View*) {
return (XFE_CommandParameters*)paragraph_style_tokens;
}
int getParameterIndex(XFE_View* view) {
TagType foo = fe_EditorParagraphPropertiesGet(view->getContext());
return XFE_CommandParametersGetIndexByData(getParameters(view),
(void*)foo);
}
void set(XFE_View* view, TagType type = P_NSDT) {
fe_EditorParagraphPropertiesSet(view->getContext(), type);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*);
};
void
SetParagraphStyleCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo* info)
{
TagType type = P_NSDT;
if (info) {
String* params = info->params;
Cardinal nparams = *info->nparams;
unsigned foo;
if (nparams > 0) {
if (tokens_cmp(paragraph_style_tokens, params[0], foo) != 0) {
type = (TagType)foo;
} else {
FE_SYNTAX_ERROR();
return;
}
}
set(view, type);
}
}
static parse_tokens_st list_style_tokens[] = {
{ "unnumbered", P_UNUM_LIST },
{ "numbered", P_NUM_LIST },
{ "directory", P_DIRECTORY },
{ "menu", P_MENU },
{ "description", P_DESC_LIST },
{ 0 }
};
class SetListStyleCommand : public AlwaysEnabledCommand
{
public:
SetListStyleCommand() : AlwaysEnabledCommand(xfeCmdSetListStyle) {};
SetListStyleCommand(char* name) : AlwaysEnabledCommand(name) {};
void set(XFE_View* view, TagType type = P_UNUM_LIST) {
fe_EditorToggleList(view->getContext(), type);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata) {
// FIXME
XFE_CommandInfo* info = (XFE_CommandInfo*)calldata;
TagType type = P_UNUM_LIST;
if (info) {
String* params = info->params;
Cardinal nparams = *info->nparams;
unsigned foo;
if (nparams > 0) {
if (tokens_cmp(list_style_tokens, params[0], foo) != 0) {
type = (TagType)foo;
} else {
FE_SYNTAX_ERROR();
return;
}
}
set(view, type);
}
};
};
static parse_tokens_st align_style_tokens[] = {
{ "left", ED_ALIGN_LEFT },
{ "center", ED_ALIGN_ABSCENTER },
{ "right", ED_ALIGN_RIGHT },
{ 0 }
};
class SetAlignStyleCommand : public AlwaysEnabledCommand
{
public:
SetAlignStyleCommand() :
AlwaysEnabledCommand(xfeCmdSetAlignmentStyle) {};
SetAlignStyleCommand(char* name) : AlwaysEnabledCommand(name) {};
virtual XP_Bool isDynamic() { return TRUE; };
XFE_CommandParameters* getParameters(XFE_View*) {
return (XFE_CommandParameters*)align_style_tokens;
}
int getParameterIndex(XFE_View* view) {
ED_Alignment align = fe_EditorAlignGet(view->getContext());
int index;
if (align == ED_ALIGN_LEFT)
index = 0;
else if (align == ED_ALIGN_ABSCENTER)
index = 1;
else if (align == ED_ALIGN_RIGHT)
index = 2;
else
index = -1;
return index;
}
void setParameterIndex(XFE_View* view, unsigned index) {
if (index < 3) {
ED_Alignment align = (ED_Alignment)align_style_tokens[index].bits;
fe_EditorAlignSet(view->getContext(), align);
}
}
void set(XFE_View* view, ED_Alignment align = ED_ALIGN_LEFT) {
fe_EditorAlignSet(view->getContext(), align);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
ED_Alignment align = ED_ALIGN_LEFT;
if (info) {
String* params = info->params;
Cardinal nparams = *info->nparams;
unsigned foo;
if (nparams > 0) {
if (tokens_cmp(align_style_tokens, params[0], foo) != 0) {
align = (ED_Alignment)foo;
} else {
FE_SYNTAX_ERROR();
return;
}
}
set(view, align);
}
};
};
static parse_tokens_st char_style_tokens[] = {
{ "bold", TF_BOLD },
{ "italic", TF_ITALIC },
{ "underline", TF_UNDERLINE },
{ "fixed", TF_FIXED },
{ "superscript", TF_SUPER },
{ "subscript", TF_SUB },
{ "strikethrough", TF_STRIKEOUT },
{ "blink", TF_BLINK },
{ "nobreak", TF_NOBREAK },
{ "none", TF_NONE }, /* probably does nothing, but TF_NONE may change */
{ 0 }
};
class SetCharacterStyleCommand : public AlwaysEnabledCommand
{
protected:
unsigned parse_info(XFE_CommandInfo* info, unsigned& style);
XP_Bool isDynamic() { return TRUE; };
void set(XFE_View* view, unsigned style = TF_NONE) {
MWContext* context = view->getContext();
if (style == TF_NONE)
fe_EditorDoPoof(context);
else
fe_EditorCharacterPropertiesSet(context, style);
}
void toggle(XFE_View* view, unsigned mask) {
MWContext* context = view->getContext();
unsigned values = (unsigned)fe_EditorCharacterPropertiesGet(context);
values ^= mask;
/*
* Super and Sub should be mutually exclusive.
*/
if (mask == TF_SUPER && (values & TF_SUPER) != 0)
values &= ~TF_SUB;
else if (mask == TF_SUB && (values & TF_SUB) != 0)
values &= ~TF_SUPER;
fe_EditorCharacterPropertiesSet(context, values);
}
public:
SetCharacterStyleCommand() :
AlwaysEnabledCommand(xfeCmdSetCharacterStyle) {};
SetCharacterStyleCommand(char* name) : AlwaysEnabledCommand(name) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata);
};
//
// I don't know why, but the SCO C++ compiler seems to object to
// (just) this function being inline. The compiler complains that
// it cannot deal with the return statement, yet this function
// is nearly identical to many other doCommand() methods in the
// file! Huh? ...djw Jan/23/97
//
void
SetCharacterStyleCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata) {
XFE_CommandInfo* info = (XFE_CommandInfo*)calldata;
unsigned style = 0x0;
if (parse_info(info, style) == 0) {
FE_SYNTAX_ERROR();
return;
}
set(view, style);
}
//
// Here's another problem inline function for the HP-UX
// and SCO C++ compilers.
// They don't like the two return statements. -slamm 2-3-97
//
unsigned
SetCharacterStyleCommand::parse_info(XFE_CommandInfo* info, unsigned& style) {
style = 0x0;
if (info) {
String* params = info->params;
Cardinal nparams = *info->nparams;
if (nparams >= 1)
return tokens_cmp(char_style_tokens, params[0], style);
}
return 0;
}
class ToggleCharacterStyleCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyle) {};
XP_Bool isDynamic() { return TRUE; };
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo* calldata);
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* calldata) {
XFE_CommandInfo* info = (XFE_CommandInfo*)calldata;
unsigned style = 0x0;
if (parse_info((XFE_CommandInfo*)calldata, style) == 0) {
FE_SYNTAX_ERROR();
} else {
toggle(view, style);
}
}
};
//
// Here's another problem inline function for the HP-UX
// and SCO C++ compilers. -slamm 2-3-97
//
Boolean
ToggleCharacterStyleCommand::isSelected(XFE_View* view, XFE_CommandInfo* calldata) {
XFE_CommandInfo* info = (XFE_CommandInfo*)calldata;
unsigned style;
if (parse_info(info, style) == 0) {
FE_SYNTAX_ERROR();
return False;
}
MWContext* context = view->getContext();
return (style & fe_EditorCharacterPropertiesGet(context)) != 0;
}
class IndentCommand : public AlwaysEnabledCommand
{
public:
IndentCommand() : AlwaysEnabledCommand(xfeCmdIndent) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorIndent(view->getContext(), False);
}
};
class OutdentCommand : public AlwaysEnabledCommand
{
public:
OutdentCommand() : AlwaysEnabledCommand(xfeCmdOutdent) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorIndent(view->getContext(), True);
}
};
class SetObjectPropertiesCommand : public AlwaysEnabledCommand
{
public:
SetObjectPropertiesCommand() :
AlwaysEnabledCommand(xfeCmdSetObjectProperties) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorObjectPropertiesDialogDo(view->getContext());
}
char* getLabel(XFE_View* view, XFE_CommandInfo* info) {
MWContext* context = view->getContext();
char* name;
ED_ElementType e_type = EDT_GetCurrentElementType(context);
switch (e_type) {
case ED_ELEMENT_HRULE:
name = "hruleProperties";
break;
case ED_ELEMENT_IMAGE:
name = "imageProperties";
break;
case ED_ELEMENT_UNKNOWN_TAG:
name = "tagProperties";
break;
case ED_ELEMENT_TARGET:
name = "targetProperties";
break;
default:
name = "textProperties";
}
Widget widget = NULL;
if (info != NULL)
widget = info->widget;
return view->getLabelString(name, widget);
}
};
class SetPagePropertiesCommand : public AlwaysEnabledCommand
{
public:
SetPagePropertiesCommand() :
AlwaysEnabledCommand(xfeCmdSetPageProperties) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorDocumentPropertiesDialogDo(view->getContext(),
XFE_EDITOR_DOCUMENT_PROPERTIES_APPEARANCE);
}
};
class SetTablePropertiesCommand : public XFE_EditorViewCommand
{
public:
SetTablePropertiesCommand() : XFE_EditorViewCommand(xfeCmdSetTableProperties) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorTableCanDelete(view->getContext());
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorTablePropertiesDialogDo(view->getContext(),
XFE_EDITOR_PROPERTIES_TABLE);
}
};
HG10297
class SetCharacterColorCommand : public AlwaysEnabledCommand
{
public:
SetCharacterColorCommand() :
AlwaysEnabledCommand(xfeCmdSetCharacterColor) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorSetColorsDialogDo(view->getContext());
}
};
class JavaPluginCommand : public AlwaysEnabledCommand
{
private:
int32 category_id;
int32 plugin_id;
public:
JavaPluginCommand(char* name, int32 cid, int32 pid) :
AlwaysEnabledCommand(name) {
category_id = cid;
plugin_id = pid;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
EDT_PerformPlugin(view->getContext(), category_id, plugin_id, 0, 0);
}
char* getLabel(XFE_View*, XFE_CommandInfo*) {
return EDT_GetPluginName(category_id, plugin_id);
};
char* getDocString(XFE_View*, XFE_CommandInfo*) {
return EDT_GetPluginMenuHelp(category_id, plugin_id);
};
};
class BrowsePageCommand : public AlwaysEnabledCommand
{
public:
BrowsePageCommand() : AlwaysEnabledCommand(xfeCmdBrowsePage) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*);
};
void
BrowsePageCommand::reallyDoCommand(XFE_View* view, XFE_CommandInfo*)
{
MWContext *context = view->getContext();
URL_Struct *url;
if (!FE_CheckAndSaveDocument(context))
return;
url = SHIST_CreateURLStructFromHistoryEntry(context,
SHIST_GetCurrent(&context->hist));
FE_GetURL(context, url);
}
class EditSourceCommand : public XFE_EditorViewCommand
{
public:
EditSourceCommand() : XFE_EditorViewCommand(xfeCmdEditPageSource) {};
XP_Bool isEnabled(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorDocumentIsSaved(view->getContext());
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorEditSource(view->getContext());
}
};
class ViewSourceCommand : public AlwaysEnabledCommand
{
public:
ViewSourceCommand() : AlwaysEnabledCommand(xfeCmdViewPageSource) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
fe_EditorDisplaySource(view->getContext());
}
};
//
// These should all go away, when commands can be properly paramaterized.
//
class SetFontSizeMinusTwoCommand : public SetFontSizeCommand
{
public:
SetFontSizeMinusTwoCommand() :
SetFontSizeCommand(xfeCmdSetFontSizeMinusTwo) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_MINUS_TWO;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_MINUS_TWO);
};
};
class SetFontSizeMinusOneCommand : public SetFontSizeCommand
{
public:
SetFontSizeMinusOneCommand() :
SetFontSizeCommand(xfeCmdSetFontSizeMinusOne) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_MINUS_ONE;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_MINUS_ONE);
};
};
class SetFontSizeZeroCommand : public SetFontSizeCommand
{
public:
SetFontSizeZeroCommand() :
SetFontSizeCommand(xfeCmdSetFontSizeZero) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_ZERO;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_ZERO);
};
};
class SetFontSizePlusOneCommand : public SetFontSizeCommand
{
public:
SetFontSizePlusOneCommand() :
SetFontSizeCommand(xfeCmdSetFontSizePlusOne) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_PLUS_ONE;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_PLUS_ONE);
};
};
class SetFontSizePlusTwoCommand : public SetFontSizeCommand
{
public:
SetFontSizePlusTwoCommand() :
SetFontSizeCommand(xfeCmdSetFontSizePlusTwo) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_PLUS_TWO;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_PLUS_TWO);
};
};
class SetFontSizePlusThreeCommand : public SetFontSizeCommand
{
public:
SetFontSizePlusThreeCommand() :
SetFontSizeCommand(xfeCmdSetFontSizePlusThree) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_PLUS_THREE;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_PLUS_THREE);
};
};
class SetFontSizePlusFourCommand : public SetFontSizeCommand
{
public:
SetFontSizePlusFourCommand() :
SetFontSizeCommand(xfeCmdSetFontSizePlusFour) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorFontSizeGet(context) == ED_FONTSIZE_PLUS_FOUR;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_FONTSIZE_PLUS_FOUR);
};
};
class SetParagraphStyleNormalCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleNormalCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleNormal) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_NSDT;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view);
};
};
class SetParagraphStyleHeadingOneCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingOneCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingOne) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_1;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_1);
};
};
class SetParagraphStyleHeadingTwoCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingTwoCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingTwo) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_2;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_2);
};
};
class SetParagraphStyleHeadingThreeCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingThreeCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingThree) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_3;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_3);
};
};
class SetParagraphStyleHeadingFourCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingFourCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingFour) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_4;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_4);
};
};
class SetParagraphStyleHeadingFiveCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingFiveCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingFive) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_5;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_5);
};
};
class SetParagraphStyleHeadingSixCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleHeadingSixCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleHeadingSix) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_HEADER_6;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_HEADER_6);
};
};
class SetParagraphStyleAddressCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleAddressCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleAddress) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_ADDRESS;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_ADDRESS);
};
};
class SetParagraphStyleFormattedCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleFormattedCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleFormatted) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_PREFORMAT;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_PREFORMAT);
};
};
class SetParagraphStyleTitleCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleTitleCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleDescriptionTitle) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_DESC_TITLE;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_DESC_TITLE);
};
};
class SetParagraphStyleTextCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleTextCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleDescriptionText) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_DESC_TEXT;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_DESC_TEXT);
};
};
class SetParagraphStyleBlockQuoteCommand : public SetParagraphStyleCommand
{
public:
SetParagraphStyleBlockQuoteCommand() :
SetParagraphStyleCommand(xfeCmdSetParagraphStyleBlockQuote) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return fe_EditorParagraphPropertiesGet(context) == P_BLOCKQUOTE;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_BLOCKQUOTE);
};
};
class SetListStyleNoneCommand : public SetListStyleCommand
{
public:
SetListStyleNoneCommand() :
SetListStyleCommand(xfeCmdSetListStyleNone) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
TagType p_type;
fe_EditorParagraphPropertiesGetAll(context, &p_type, NULL, NULL);
return p_type != P_LIST_ITEM;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
fe_EditorParagraphPropertiesSetAll(context,
P_NSDT,
NULL,
fe_EditorAlignGet(context));
};
};
class SetListStyleBulletedCommand : public SetListStyleCommand
{
public:
SetListStyleBulletedCommand() :
SetListStyleCommand(xfeCmdSetListStyleBulleted) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
TagType p_type;
EDT_ListData l_data;
fe_EditorParagraphPropertiesGetAll(context, &p_type, &l_data, NULL);
return (p_type == P_LIST_ITEM) && (l_data.iTagType == P_UNUM_LIST);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_UNUM_LIST);
};
};
class SetListStyleNumberedCommand : public SetListStyleCommand
{
public:
SetListStyleNumberedCommand() :
SetListStyleCommand(xfeCmdSetListStyleNumbered) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
TagType p_type;
EDT_ListData l_data;
fe_EditorParagraphPropertiesGetAll(context, &p_type, &l_data, NULL);
return (p_type == P_LIST_ITEM) && (l_data.iTagType == P_NUM_LIST);
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, P_NUM_LIST);
};
};
class SetAlignStyleLeftCommand : public SetAlignStyleCommand
{
public:
SetAlignStyleLeftCommand() :
SetAlignStyleCommand(xfeCmdSetAlignmentStyleLeft) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorAlignGet(view->getContext()) == ED_ALIGN_LEFT;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_ALIGN_LEFT);
};
};
class SetAlignStyleCenterCommand : public SetAlignStyleCommand
{
public:
SetAlignStyleCenterCommand() :
SetAlignStyleCommand(xfeCmdSetAlignmentStyleCenter) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorAlignGet(view->getContext()) == ED_ALIGN_ABSCENTER;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_ALIGN_ABSCENTER);
};
};
class SetAlignStyleRightCommand : public SetAlignStyleCommand
{
public:
SetAlignStyleRightCommand() :
SetAlignStyleCommand(xfeCmdSetAlignmentStyleRight) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
return fe_EditorAlignGet(view->getContext()) == ED_ALIGN_RIGHT;
}
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, ED_ALIGN_RIGHT);
};
};
class ClearAllStylesCommand : public SetCharacterStyleCommand
{
public:
ClearAllStylesCommand() :
SetCharacterStyleCommand(xfeCmdClearAllStyles) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
set(view, TF_NONE);
};
};
class ToggleCharacterStyleBoldCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleBoldCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleBold) {};
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_BOLD);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_BOLD & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_BOLD);
};
};
class ToggleCharacterStyleUnderlineCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleUnderlineCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleUnderline) {};
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_UNDERLINE);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_UNDERLINE & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_UNDERLINE);
};
};
class ToggleCharacterStyleItalicCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleItalicCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleItalic) {};
XP_Bool isDeterminate(XFE_View* view, XFE_CommandInfo*) {
return style_is_determinate(view->getContext(), TF_ITALIC);
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_ITALIC & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_ITALIC);
};
};
class ToggleCharacterStyleFixedCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleFixedCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleFixed) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_FIXED & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_FIXED);
};
};
class ToggleCharacterStyleSuperscriptCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleSuperscriptCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleSuperscript)
{};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_SUPER & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_SUPER);
};
};
class ToggleCharacterStyleSubscriptCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleSubscriptCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleSubscript)
{};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_SUB & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_SUB);
};
};
class ToggleCharacterStyleStrikethroughCommand :
public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleStrikethroughCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleStrikethrough) {
};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_STRIKEOUT & fe_EditorCharacterPropertiesGet(context))
!= 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_STRIKEOUT);
};
};
class ToggleCharacterStyleBlinkCommand : public SetCharacterStyleCommand
{
public:
ToggleCharacterStyleBlinkCommand() :
SetCharacterStyleCommand(xfeCmdToggleCharacterStyleBlink) {};
XP_Bool isSelected(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
return (TF_BLINK & fe_EditorCharacterPropertiesGet(context)) != 0;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
toggle(view, TF_BLINK);
};
};
enum {
MOVE_NOWHERE = 0,
MOVE_UP, // previous line
MOVE_DOWN,
MOVE_NEXT, // character
MOVE_PREVIOUS, // character
MOVE_BEGINNING_OF_LINE,
MOVE_END_OF_LINE,
MOVE_BEGINNING_OF_DOCUMENT,
MOVE_END_OF_DOCUMENT,
MOVE_NEXT_WORD,
MOVE_PREVIOUS_WORD,
MOVE_NEXT_TABLE_CELL,
MOVE_PREVIOUS_TABLE_CELL
} MoveCommandDirection_t;
static parse_tokens_st move_command_directions[] = {
{ "next", MOVE_NEXT },
{ "previous", MOVE_PREVIOUS },
{ "up", MOVE_UP },
{ "previousLine", MOVE_UP },
{ "down", MOVE_DOWN },
{ "nextLine", MOVE_DOWN },
{ "beginningOfLine", MOVE_BEGINNING_OF_LINE },
{ "beginOfLine", MOVE_BEGINNING_OF_LINE },
{ "endOfLine", MOVE_END_OF_LINE },
{ "beginningOfPage", MOVE_BEGINNING_OF_DOCUMENT },
{ "endOfPage", MOVE_END_OF_DOCUMENT },
{ "nextWord", MOVE_NEXT_WORD },
{ "previousWord", MOVE_PREVIOUS_WORD },
{ "nextCell", MOVE_NEXT_TABLE_CELL },
{ "previousCell", MOVE_PREVIOUS_TABLE_CELL },
{ 0 },
};
class MoveCommand : public AlwaysEnabledCommand
{
public:
MoveCommand() : AlwaysEnabledCommand(xfeCmdMoveCursor) {};
virtual XP_Bool isSlow() {
return FALSE;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
unsigned direction = MOVE_NOWHERE;
MWContext* context = view->getContext();
if (info != NULL && *info->nparams > 0) {
char* param = info->params[0];
if (tokens_cmp(move_command_directions, param, direction) != 1)
direction = MOVE_NOWHERE;
}
Boolean shifted, ctrl;
xfe_GetShiftAndCtrl(info->event, &shifted, &ctrl);
switch (direction) {
case MOVE_UP: // previous line
EDT_Up(context, shifted); break;
case MOVE_DOWN:
EDT_Down(context, shifted); break;
case MOVE_NEXT: // character
EDT_NextChar(context, shifted); break;
case MOVE_PREVIOUS: // character
EDT_PreviousChar(context, shifted); break;
case MOVE_BEGINNING_OF_LINE:
EDT_BeginOfLine(context, shifted); break;
case MOVE_END_OF_LINE:
EDT_EndOfLine(context, shifted); break;
case MOVE_BEGINNING_OF_DOCUMENT:
EDT_BeginOfDocument(context, shifted); break;
case MOVE_END_OF_DOCUMENT:
EDT_EndOfDocument(context, shifted); break;
case MOVE_NEXT_WORD:
EDT_NextWord(context, shifted); break;
case MOVE_PREVIOUS_WORD:
EDT_PreviousWord(context, shifted); break;
case MOVE_NEXT_TABLE_CELL:
EDT_NextTableCell(context, shifted); break;
case MOVE_PREVIOUS_TABLE_CELL:
EDT_PreviousTableCell(context, shifted); break;
default:
FE_SYNTAX_ERROR();
}
};
};
class KeyInsertCommand : public AlwaysEnabledCommand
{
public:
KeyInsertCommand() : AlwaysEnabledCommand(xfeCmdKeyInsert) {};
virtual XP_Bool requiresChromeUpdate() {
return FALSE;
};
virtual XP_Bool isSlow() {
return FALSE;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
MWContext* context = view->getContext();
if (info != NULL) {
fe_EditorKeyInsert(context, info->widget, info->event);
}
};
};
class InsertReturnCommand : public AlwaysEnabledCommand
{
public:
InsertReturnCommand() : AlwaysEnabledCommand(xfeCmdInsertReturn) {};
virtual XP_Bool isSlow() {
return FALSE;
};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
EDT_ReturnKey(context);
};
};
static parse_tokens_st insert_line_break_types[] = {
{ "normal", (unsigned)ED_BREAK_NORMAL },
{ "left", (unsigned)ED_BREAK_LEFT },
{ "right", (unsigned)ED_BREAK_RIGHT },
{ "both", (unsigned)ED_BREAK_BOTH },
{ NULL }
};
class InsertLineBreakCommand : public AlwaysEnabledCommand
{
public:
InsertLineBreakCommand() : AlwaysEnabledCommand(xfeCmdInsertLineBreak) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
ED_BreakType type = ED_BREAK_NORMAL;
MWContext* context = view->getContext();
if (info != NULL && *info->nparams > 0) {
char* param = info->params[0];
unsigned foo;
if (tokens_cmp(insert_line_break_types, param, foo) != 1)
type = (ED_BreakType)-1;
else
type = (ED_BreakType)foo;
}
switch (type) {
case ED_BREAK_NORMAL:
case ED_BREAK_LEFT:
case ED_BREAK_RIGHT:
case ED_BREAK_BOTH:
fe_EditorLineBreak(context, type);
break;
default:
FE_SYNTAX_ERROR();
}
};
};
class TabCommand : public AlwaysEnabledCommand
{
public:
TabCommand() : AlwaysEnabledCommand(xfeCmdTab) {};
virtual XP_Bool isSlow() {
return FALSE;
};
virtual void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
Boolean forward = TRUE;
Boolean force = FALSE;
Boolean error = FALSE;
if (info != NULL && *info->nparams > 0) {
if (XP_STRCASECMP(info->params[0], "forward") == 0)
forward = TRUE;
else if (XP_STRCASECMP(info->params[0], "backward") == 0)
forward = FALSE;
else if (XP_STRCASECMP(info->params[0], "insert") == 0)
force = TRUE;
else {
error = TRUE;
FE_SYNTAX_ERROR();
}
}
if (!error)
fe_EditorTab(view->getContext(), forward, force);
};
};
class SelectCommand : public XFE_ViewCommand
{
public:
SelectCommand() : XFE_ViewCommand(xfeCmdSelect) {};
virtual XP_Bool isSlow() {
return FALSE;
};
//
// This guy impliments doCommand() itself so that it can manage
// update chrome dynamically.
//
void doCommand(XFE_View* view, XFE_CommandInfo* info);
};
void
SelectCommand::doCommand(XFE_View* view, XFE_CommandInfo* info) {
MWContext* context = view->getContext();
if (info != NULL && *info->nparams > 0) {
char* param = info->params[0];
unsigned do_chrome = 0;
if (XP_STRCASECMP(param, "grab") == 0) {
fe_EditorGrabFocus(context, info->event);
do_chrome++;
} else if (XP_STRCASECMP(param, "begin") == 0) {
fe_EditorSelectionBegin(context, info->event);
do_chrome++;
} else if (XP_STRCASECMP(param, "extend") == 0) {
fe_EditorSelectionExtend(context, info->event);
} else if (XP_STRCASECMP(param, "end") == 0) {
fe_EditorSelectionEnd(context, info->event);
do_chrome++;
} else if (XP_STRCASECMP(param, "word") == 0) {
unsigned long x;
unsigned long y;
fe_EventLOCoords(context, info->event, &x, &y);
EDT_DoubleClick(context, x, y); /* this takes screen co-ords?? */
do_chrome++;
} else {
FE_SYNTAX_ERROR();
}
if (do_chrome != 0) {
XFE_Component* top = view->getToplevel();
top->notifyInterested(XFE_View::chromeNeedsUpdating);
}
}
}
class EditorObjectIsCommand : public XFE_ObjectIsCommand
{
public:
char* getObjectType(XFE_View*);
};
char*
EditorObjectIsCommand::getObjectType(XFE_View* view)
{
ED_ElementType e_type; /* jag */
e_type = EDT_GetCurrentElementType(view->getContext());
switch (e_type) {
case ED_ELEMENT_TEXT: return "text";
case ED_ELEMENT_IMAGE: return "image";
case ED_ELEMENT_UNKNOWN_TAG: return "tag";
case ED_ELEMENT_TARGET: return "target";
case ED_ELEMENT_HRULE: return "hrule";
default: return "unknown";
}
}
class DialogCommand : public XFE_ViewCommand
{
public:
DialogCommand() : XFE_ViewCommand(xfeCmdDialog) {};
void doCommand(XFE_View* view, XFE_CommandInfo* info) {
MWContext* context = view->getContext();
unsigned nerrors = 0;
String* av = info->params;
if (info != NULL && *info->nparams == 1) {
if (XP_STRCASECMP(av[0], "text") == 0)
fe_EditorPropertiesDialogDo(context,
XFE_EDITOR_PROPERTIES_CHARACTER);
else if (XP_STRCASECMP(av[0], "paragraph") == 0)
fe_EditorPropertiesDialogDo(context,
XFE_EDITOR_PROPERTIES_PARAGRAPH);
else if (XP_STRCASECMP(av[0], "link") == 0)
fe_EditorPropertiesDialogDo(context,
XFE_EDITOR_PROPERTIES_LINK);
else if (XP_STRCASECMP(av[0], "target") == 0)
fe_EditorTargetPropertiesDialogDo(context);
else if (XP_STRCASECMP(av[0], "image") == 0)
fe_EditorPropertiesDialogDo(context,
XFE_EDITOR_PROPERTIES_IMAGE);
else if (XP_STRCASECMP(av[0], "hrule") == 0)
fe_EditorHorizontalRulePropertiesDialogDo(context);
else if (XP_STRCASECMP(av[0], "tag") == 0)
fe_EditorHtmlPropertiesDialogDo(context);
else if (XP_STRCASECMP(av[0], "document") == 0)
fe_EditorDocumentPropertiesDialogDo(context,
XFE_EDITOR_DOCUMENT_PROPERTIES_APPEARANCE);
else if (XP_STRCASECMP(av[0], "table") == 0)
fe_EditorTablePropertiesDialogDo(context,
XFE_EDITOR_PROPERTIES_TABLE);
else if (XP_STRCASECMP(av[0], "table-insert") == 0)
fe_EditorTableCreateDialogDo(context);
else if (XP_STRCASECMP(av[0], "color") == 0)
fe_EditorSetColorsDialogDo(context);
else if (XP_STRCASECMP(av[0], "publish") == 0)
fe_EditorPublishDialogDo(context);
else
nerrors++;
} else {
nerrors++;
}
if (nerrors != 0)
FE_SYNTAX_ERROR();
};
};
static void
fe_get_selected_text_rect(MWContext* context,
LO_TextStruct* text,
int32* rect_x,
int32* rect_y,
int32* rect_width,
int32* rect_height)
{
PA_Block text_save = text->text;
int len_save = text->text_len;
LO_TextInfo info;
text->text_len = text->sel_start;
XFE_GetTextInfo(context, text, &info);
*rect_x = text->x + text->x_offset + info.max_width;
*rect_y = text->y + text->y_offset;
text->text = (PA_Block)((char*)text->text + text->sel_start);
text->text_len = text->sel_end - text->sel_start;
XFE_GetTextInfo(context, text, &info);
*rect_width = info.max_width;
*rect_height = info.ascent + info.descent;
text->text = text_save;
text->text_len = len_save;
}
static Boolean
fe_editor_selection_contains_point(MWContext* context, int32 x, int32 y)
{
int32 start_selection;
int32 end_selection;
LO_Element* start_element = NULL;
LO_Element* end_element = NULL;
LO_Element* lo_element;
int32 rect_x;
int32 rect_y;
int32 rect_width;
int32 rect_height;
CL_Layer *layer;
if (!EDT_IsSelected(context))
return FALSE;
LO_GetSelectionEndpoints(context,
&start_element,
&end_element,
&start_selection,
&end_selection,
&layer);
if (start_element == NULL)
return FALSE;
for (lo_element = start_element;
lo_element != NULL;
lo_element = ((LO_Any *)lo_element)->next) {
if (lo_element->type == LO_TEXT &&
(lo_element == start_element || lo_element == end_element)) {
LO_TextStruct* text = (LO_TextStruct*)lo_element;
if (text->text == NULL) {
if (text->prev != NULL && text->prev->type == LO_TEXT) {
text = (LO_TextStruct*)text->prev;
} else {
text = (LO_TextStruct*)text->next;
}
}
if (text->text == NULL)
continue;
fe_get_selected_text_rect(context, text,
&rect_x,
&rect_y,
&rect_width,
&rect_height);
} else if (lo_element->type == LO_LINEFEED) {
continue;
} else {
LO_Any* lo_any = (LO_Any*)lo_element;
rect_x = lo_any->x + lo_any->x_offset;
rect_y = lo_any->y + lo_any->y_offset;
rect_width = lo_any->width;
rect_height = lo_any->height;
}
if (x > rect_x && y > rect_y &&
x < (rect_x + rect_width) && y < (rect_y + rect_height))
return TRUE;
if (lo_element == end_element)
break;
}
return FALSE;
}
class EditorPopupCommand : public XFE_EditorViewCommand
{
public:
EditorPopupCommand() : XFE_EditorViewCommand(xfeCmdShowPopup) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info);
};
void
EditorPopupCommand::reallyDoCommand(XFE_View* v_view, XFE_CommandInfo* info)
{
XFE_EditorView* view = (XFE_EditorView*)v_view;
if (info != NULL) {
MWContext* context = view->getContext();
unsigned long x;
unsigned long y;
XFE_PopupMenu* popup;
XFE_Frame *frame;
fe_EventLOCoords(context, info->event, &x, &y);
if (!fe_editor_selection_contains_point(context, x, y))
EDT_SelectObject(context, x, y);
frame = (XFE_Frame*)view->getToplevel();
#ifdef ENDER
if (! EDITOR_CONTEXT_DATA(context)->embedded)
#endif /* ENDER */
context = frame->getContext();
popup = fe_EditorNewPopupMenu(frame, info->widget, context);
view->setPopupMenu(popup);
popup = view->getPopupMenu();
if (popup != NULL) {
popup->position(info->event);
popup->show();
}
}
}
static char*
get_base_url(MWContext* context, char* rel_url)
{
History_entry* hist_ent;
if (context != NULL && rel_url != NULL) {
hist_ent = SHIST_GetCurrent(&context->hist);
if (hist_ent != NULL) {
return NET_MakeAbsoluteURL(hist_ent->address, rel_url);
/*caller must XP_FREE()*/
}
}
return NULL;
}
static char label_buf[256];
class BrowseLinkCommand : public XFE_EditorViewCommand
{
public:
BrowseLinkCommand() : XFE_EditorViewCommand(xfeCmdOpenLinkNew) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
EDT_HREFData* href_data = EDT_GetHREFData(context);
if (href_data != NULL) {
if (href_data->pURL != NULL) {
char* abs = get_base_url(context, href_data->pURL);
if (abs != NULL) {
URL_Struct* url = NET_CreateURLStruct(abs,NET_DONT_RELOAD);
FE_GetURL(context, url);
XP_FREE(abs);
}
}
EDT_FreeHREFData(href_data);
}
}
char* getLabel(XFE_View* view, XFE_CommandInfo* info) {
char* s = NULL;
char* link = NULL;
char* res_name = NULL;
MWContext* context = view->getContext();
EDT_HREFData* href_data = EDT_GetHREFData(context);
if (href_data != NULL) {
if (href_data->pURL != NULL) {
link = XP_STRRCHR(href_data->pURL, '/');
if (link != NULL)
link++;
else
link = href_data->pURL;
res_name = "browseToLink";
}
}
if (info != NULL && res_name != NULL && link != NULL) {
s = XfeSubResourceGetStringValue(info->widget,
res_name,
XfeClassNameForWidget(info->widget),
XmNlabelString,
XmCLabelString,
NULL);
if (s != NULL)
XP_SPRINTF(label_buf, s, link);
s = label_buf;
}
if (href_data != NULL)
EDT_FreeHREFData(href_data);
return s;
};
};
class EditLinkCommand : public XFE_EditorViewCommand
{
public:
EditLinkCommand() : XFE_EditorViewCommand(xfeCmdOpenLinkEdit) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
EDT_HREFData* href_data = EDT_GetHREFData(context);
if (href_data != NULL) {
if (href_data->pURL != NULL) {
char* abs = get_base_url(context, href_data->pURL);
if (abs != NULL) {
fe_EditorNew(context, 0, 0, abs);
XP_FREE(abs);
}
}
EDT_FreeHREFData(href_data);
}
}
};
class BookmarkLinkCommand : public XFE_EditorViewCommand
{
public:
BookmarkLinkCommand() : XFE_EditorViewCommand(xfeCmdAddLinkBookmark) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo*) {
MWContext* context = view->getContext();
EDT_HREFData* href_data = EDT_GetHREFData(context);
if (href_data != NULL) {
if (href_data->pURL != NULL) {
fe_AddToBookmark(context, 0,
NET_CreateURLStruct(href_data->pURL, NET_DONT_RELOAD), 0);
}
EDT_FreeHREFData(href_data);
}
}
};
class CopyLinkCommand : public XFE_EditorViewCommand
{
public:
CopyLinkCommand() : XFE_EditorViewCommand(xfeCmdCopyLink) {};
void reallyDoCommand(XFE_View* view, XFE_CommandInfo* info) {
if (info != NULL) {
MWContext* context = view->getContext();
EDT_HREFData* href_data = EDT_GetHREFData(context);
Time now = fe_GetTimeFromEvent(info->event);
if (href_data != NULL) {
if (href_data->pURL != NULL) {
fe_EditorCopyToClipboard(context, href_data->pURL, now);
}
EDT_FreeHREFData(href_data);
}
}
}
};
// END OF COMMAND DEFINES
static XFE_CommandList* my_commands = 0;
XFE_EditorView::XFE_EditorView(XFE_Component *toplevel_component,
Widget parent,
XFE_View *parent_view,
MWContext *context)
: XFE_HTMLView(toplevel_component, parent, parent_view, context)
{
m_update_timer = 0;
//
// Register editor drop site
//
_dropSite=new XFE_EditorDrop(getBaseWidget(),this);
_dropSite->enable();
if (my_commands != 0)
return;
registerCommand(my_commands, new BrowseLinkCommand);
registerCommand(my_commands, new EditLinkCommand);
registerCommand(my_commands, new BookmarkLinkCommand);
registerCommand(my_commands, new CopyLinkCommand);
registerCommand(my_commands, new EditorPopupCommand);
registerCommand(my_commands, new UndoCommand);
registerCommand(my_commands, new RedoCommand);
registerCommand(my_commands, new CutCommand);
registerCommand(my_commands, new CopyCommand);
registerCommand(my_commands, new PasteCommand);
registerCommand(my_commands, new DeleteCommand);
registerCommand(my_commands, new SpellCommand);
registerCommand(my_commands, new SaveCommand);
registerCommand(my_commands, new SaveAsCommand);
registerCommand(my_commands, new PublishCommand);
registerCommand(my_commands, new DeleteTableCommand);
registerCommand(my_commands, new DeleteTableCellCommand);
registerCommand(my_commands, new DeleteTableRowCommand);
registerCommand(my_commands, new DeleteTableColumnCommand);
registerCommand(my_commands, new SelectTableCommand);
registerCommand(my_commands, new SelectTableCellCommand);
registerCommand(my_commands, new SelectTableRowCommand);
registerCommand(my_commands, new SelectTableColumnCommand);
registerCommand(my_commands, new TableJoinCommand);
registerCommand(my_commands, new ConvertTextToTableCommand);
registerCommand(my_commands, new ConvertTableToTextCommand);
registerCommand(my_commands, new RemoveLinkCommand);
registerCommand(my_commands, new SelectAllCommand);
registerCommand(my_commands, new FindCommand);
registerCommand(my_commands, new FindAgainCommand);
registerCommand(my_commands, new ToggleTableBordersCommand);
registerCommand(my_commands, new ToggleParagraphMarksCommand);
registerCommand(my_commands, new ReloadCommand);
registerCommand(my_commands, new RefreshCommand);
registerCommand(my_commands, new InsertLinkCommand);
registerCommand(my_commands, new InsertTargetCommand);
registerCommand(my_commands, new InsertImageCommand);
registerCommand(my_commands, new InsertHorizontalLineCommand);
registerCommand(my_commands, new InsertBulletedListCommand);
registerCommand(my_commands, new InsertNumberedListCommand);
registerCommand(my_commands, new InsertTableCommand);
registerCommand(my_commands, new InsertTableRowCommand);
registerCommand(my_commands, new InsertTableColumnCommand);
registerCommand(my_commands, new InsertTableCellCommand);
registerCommand(my_commands, new InsertHtmlCommand);
registerCommand(my_commands, new InsertLineBreakCommand);
registerCommand(my_commands, new InsertBreakBelowImageCommand);
registerCommand(my_commands, new InsertNonBreakingSpaceCommand);
registerCommand(my_commands, new SetFontSizeCommand);
registerCommand(my_commands, new SetFontFaceCommand);
registerCommand(my_commands, new SetFontColorCommand);
registerCommand(my_commands, new SetParagraphStyleCommand);
registerCommand(my_commands, new SetListStyleCommand);
registerCommand(my_commands, new SetAlignStyleCommand);
registerCommand(my_commands, new SetCharacterStyleCommand);
registerCommand(my_commands, new ToggleCharacterStyleCommand);
registerCommand(my_commands, new ClearAllStylesCommand);
registerCommand(my_commands, new IndentCommand);
registerCommand(my_commands, new OutdentCommand);
registerCommand(my_commands, new SetObjectPropertiesCommand);
registerCommand(my_commands, new SetPagePropertiesCommand);
registerCommand(my_commands, new SetTablePropertiesCommand);
HG81272
registerCommand(my_commands, new SetCharacterColorCommand);
registerCommand(my_commands, new BrowsePageCommand);
registerCommand(my_commands, new EditSourceCommand);
registerCommand(my_commands, new ViewSourceCommand);
registerCommand(my_commands, new EditorObjectIsCommand);
registerCommand(my_commands, new DialogCommand);
registerCommand(my_commands, new TabCommand);
// non-paramaterized font size commands.
registerCommand(my_commands, new SetFontSizeMinusTwoCommand);
registerCommand(my_commands, new SetFontSizeMinusOneCommand);
registerCommand(my_commands, new SetFontSizeZeroCommand);
registerCommand(my_commands, new SetFontSizePlusOneCommand);
registerCommand(my_commands, new SetFontSizePlusTwoCommand);
registerCommand(my_commands, new SetFontSizePlusThreeCommand);
registerCommand(my_commands, new SetFontSizePlusFourCommand);
registerCommand(my_commands, new SetParagraphStyleNormalCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingOneCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingTwoCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingThreeCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingFourCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingFiveCommand);
registerCommand(my_commands, new SetParagraphStyleHeadingSixCommand);
registerCommand(my_commands, new SetParagraphStyleAddressCommand);
registerCommand(my_commands, new SetParagraphStyleFormattedCommand);
registerCommand(my_commands, new SetParagraphStyleTitleCommand);
registerCommand(my_commands, new SetParagraphStyleTextCommand);
registerCommand(my_commands, new SetParagraphStyleBlockQuoteCommand);
registerCommand(my_commands, new SetListStyleNoneCommand);
registerCommand(my_commands, new SetListStyleBulletedCommand);
registerCommand(my_commands, new SetListStyleNumberedCommand);
registerCommand(my_commands, new SetAlignStyleLeftCommand);
registerCommand(my_commands, new SetAlignStyleCenterCommand);
registerCommand(my_commands, new SetAlignStyleRightCommand);
registerCommand(my_commands, new ToggleCharacterStyleBoldCommand);
registerCommand(my_commands, new ToggleCharacterStyleItalicCommand);
registerCommand(my_commands, new ToggleCharacterStyleUnderlineCommand);
registerCommand(my_commands, new ToggleCharacterStyleFixedCommand);
registerCommand(my_commands, new ToggleCharacterStyleSuperscriptCommand);
registerCommand(my_commands, new ToggleCharacterStyleSubscriptCommand);
registerCommand(my_commands, new ToggleCharacterStyleStrikethroughCommand);
registerCommand(my_commands, new ToggleCharacterStyleBlinkCommand);
//
// Register Java Plugin Commands.
//
int32 ncategories = EDT_NumberOfPluginCategories();
for (int32 nc = 0; nc < ncategories; nc++) {
int32 nplugins = EDT_NumberOfPlugins(nc);
for (int32 np = 0; np < nplugins; np++) {
char buf[64];
char* name;
sprintf(buf, "javaPlugin_%d_%d", nc, np);
name = Command::intern(buf);
registerCommand(my_commands, new JavaPluginCommand(name, nc, np));
}
}
//
// Insert these last, so they are at the head of the command
// list, and will get found quickly.
//
registerCommand(my_commands, new InsertReturnCommand);
registerCommand(my_commands, new SelectCommand);
registerCommand(my_commands, new MoveCommand);
registerCommand(my_commands, new KeyInsertCommand);
}
XFE_EditorView::~XFE_EditorView()
{
if (_dropSite) {
delete _dropSite;
_dropSite=NULL;
}
if (m_update_timer != 0) {
XtRemoveTimeOut(m_update_timer);
m_update_timer = 0;
}
}
char*
XFE_EditorView::getPlainText()
{
// This method suppose to get the text message in the widget
// and return in a char string block
return NULL;
}
#ifdef DEBUG_editor
#define TRACE(x) printf x
#else
#define TRACE(x)
#endif
XFE_Command*
XFE_EditorView::getCommand(CommandType cmd)
{
XFE_Command* command = findCommand(my_commands, cmd);
if (command != NULL)
return command;
else
return XFE_HTMLView::getCommand(cmd);
}
void
XFE_EditorView::insertMessageCompositionText(const char* text,
XP_Bool leaveCursorBeginning, XP_Bool isHTML)
{
#ifdef DEBUG_editor
fprintf(stderr, "ping::[ insertMessageCompositionText ]\n");
#endif
if (m_contextData) {
Boolean noTagsP = False;
Boolean inDraft = False;
ED_BufferOffset ins = -1;
if ( leaveCursorBeginning ){
ins = EDT_GetInsertPointOffset( m_contextData );
}
if (isHTML) {
//
// NOTE: let's try to see if they really have any HTML tags
// in the text they've given us... [ poor man's parser ]
//
char *xtop = XP_STRSTR( text, "<HTML>" );
int s1 = XP_STRLEN( text );
int s2 = 0;
int n = 0;
#ifdef DEBUG_editor
fprintf(stderr, " paste::[ %d ]\n", s1);
#endif
if ( xtop ) {
s2 = XP_STRLEN( xtop );
n = s1 - s2;
}
if ( xtop && ( n < 2 )) {
inDraft = True;
}
else {
s2 = 0;
n = 0;
if (XP_STRCASESTR(text, "</A>") ||
XP_STRCASESTR(text, "<PRE>") ||
XP_STRCASESTR(text, "<HR") ||
XP_STRCASESTR(text, "<IMG") ||
XP_STRCASESTR(text, "<TABLE")
) {
noTagsP = False;
}
else {
#ifdef DEBUG_editor
fprintf(stderr,
"WARNING... [ looks like plaintext to me ]\n");
#endif
noTagsP = True;
}
}
EDT_PasteQuoteBegin( m_contextData, isHTML );
char *xsig = 0;
char *xtra = 0;
if (inDraft) {
// NOTE: we're loading a draft message, don't mess with it!!!
//
xtra = 0;
xsig = 0;
EDT_PasteQuote( m_contextData, (char *) text );
}
else {
// NOTE: try to figure out if we've got a signature...
//
if (s1 > 2) {
xsig = XP_STRSTR( text, "-- " );
if (xsig) {
s2 = XP_STRLEN( xsig );
n = s1 - s2;
}
}
if ( n > 1 ) {
xtra = (char *) XP_ALLOC( n + 1 );
XP_STRNCPY_SAFE(xtra, text, n );
#ifdef DEBUG_editor
fprintf(stderr,
"WARNING... [ hacking pre-signature string ]\n");
#endif
}
else {
xtra = 0;
if ( n == 0 ) {
xsig = (char *) text;
}
}
if ( xtra ) {
EDT_PasteQuote( m_contextData, (char *) xtra );
}
EDT_PasteQuote( m_contextData, "<BR>");
#ifdef DEBUG_editor
fprintf(stderr,
"WARNING... [ insert pre-sig break ]\n");
#endif
if (noTagsP)
EDT_PasteQuote( m_contextData, "<PRE>");
EDT_PasteQuote( m_contextData, (char *) xsig );
if (noTagsP)
EDT_PasteQuote( m_contextData, "</PRE>" );
EDT_PasteQuote( m_contextData, "<BR>" );
#ifdef DEBUG_editor
fprintf(stderr,
"WARNING... [ insert post-sig break ]\n");
#endif
}
EDT_PasteQuoteEnd( m_contextData );
if ( xtra ) {
XP_FREE( xtra );
}
}
else {
EDT_PasteText( m_contextData, (char *) text );
}
if ( leaveCursorBeginning && ins != -1 ) {
EDT_SetInsertPointToOffset( m_contextData, ins, 0 );
}
}
}
void
XFE_EditorView::getMessageBody(char **pBody, uint32 *body_size,
MSG_FontCode** /*font_changes*/)
{
#ifdef DEBUG_editor
fprintf(stderr, "ping::[ getMessageBody ]\n");
#endif
*pBody = NULL;
*body_size = 0;
EDT_SaveToBuffer(m_contextData, pBody);
if ( !*pBody){
// oops...
}
else {
size_t lsize;
lsize = strlen(*pBody);
*body_size = lsize;
}
}
void
XFE_EditorView::doneWithMessageBody(char* /*pBody*/)
{
#ifdef DEBUG_editor
fprintf(stderr, "ping::[ doneWithMessageBody ]\n");
#endif
}
void
XFE_EditorView::DocEncoding (XFE_NotificationCenter *, void *, void *callData)
{
int new_doc_csid = (int)callData;
#ifdef DEBUG_editor
fprintf(stderr, "DocEncoding::[ %d ]\n", new_doc_csid);
#endif
EDT_SetEncoding(m_contextData, new_doc_csid);
}
Boolean
XFE_EditorView::isModified()
{
return EDT_DirtyFlag(m_contextData);
}
void
XFE_EditorView::updateChromeTimeout(XtPointer closure, XtIntervalId*)
{
XFE_EditorView* view = (XFE_EditorView*)closure;
// do this before you do anything else
view->m_update_timer = 0;
// tell the frame to update.
XFE_Component* top = view->getToplevel();
top->notifyInterested(XFE_View::chromeNeedsUpdating);
}
void
XFE_EditorView::updateChrome()
{
Cardinal delay = fe_globalData.editor_update_delay;
//
// If there is an outstanding timer, reset, and start again.
// This way we always wait until we just not doing anything
// to redraw the toolbars. This should probably be a workproc
// thing, we don't have Xt WorkProcs and right now, I don't
// want to mess with fe_EventLoop() to make them work.
//
if (m_update_timer != 0) {
XtRemoveTimeOut(m_update_timer);
m_update_timer = 0;
}
if (delay != 0) {
m_update_timer = XtAppAddTimeOut(fe_XtAppContext,
delay,
updateChromeTimeout,
this);
} else {
updateChromeTimeout(this, 0);
}
}
XFE_View*
XFE_EditorView::getCommandView(XFE_Command*)
{
return this;
}