?? jsediting.cpp
字號:
/*
* Copyright (C) 2004 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "jsediting.h"
#include "cssproperties.h"
#include "htmlediting.h"
#include "khtml_part.h"
#include "qstring.h"
#include "selection.h"
#if APPLE_CHANGES
#include "KWQKHTMLPart.h"
#endif
using khtml::TypingCommand;
namespace DOM {
class DocumentImpl;
namespace {
bool supportsPasteCommand = false;
struct CommandImp {
bool (*execFn)(KHTMLPart *part, bool userInterface, const DOMString &value);
bool (*enabledFn)(KHTMLPart *part);
KHTMLPart::TriState (*stateFn)(KHTMLPart *part);
DOMString (*valueFn)(KHTMLPart *part);
};
QDict<CommandImp> createCommandDictionary();
const CommandImp *commandImp(const DOMString &command)
{
static QDict<CommandImp> commandDictionary = createCommandDictionary();
return commandDictionary.find(command.string());
}
} // anonymous namespace
bool JSEditor::execCommand(const DOMString &command, bool userInterface, const DOMString &value)
{
const CommandImp *cmd = commandImp(command);
if (!cmd)
return false;
KHTMLPart *part = m_doc->part();
if (!part)
return false;
m_doc->updateLayout();
return cmd->enabledFn(part) && cmd->execFn(part, userInterface, value);
}
bool JSEditor::queryCommandEnabled(const DOMString &command)
{
const CommandImp *cmd = commandImp(command);
if (!cmd)
return false;
KHTMLPart *part = m_doc->part();
if (!part)
return false;
m_doc->updateLayout();
return cmd->enabledFn(part);
}
bool JSEditor::queryCommandIndeterm(const DOMString &command)
{
const CommandImp *cmd = commandImp(command);
if (!cmd)
return false;
KHTMLPart *part = m_doc->part();
if (!part)
return false;
m_doc->updateLayout();
return cmd->stateFn(part) == KHTMLPart::mixedTriState;
}
bool JSEditor::queryCommandState(const DOMString &command)
{
const CommandImp *cmd = commandImp(command);
if (!cmd)
return false;
KHTMLPart *part = m_doc->part();
if (!part)
return false;
m_doc->updateLayout();
return cmd->stateFn(part) != KHTMLPart::falseTriState;
}
bool JSEditor::queryCommandSupported(const DOMString &command)
{
if (!supportsPasteCommand && command.string().lower() == "paste")
return false;
return commandImp(command) != 0;
}
DOMString JSEditor::queryCommandValue(const DOMString &command)
{
const CommandImp *cmd = commandImp(command);
if (!cmd)
return DOMString();
KHTMLPart *part = m_doc->part();
if (!part)
return DOMString();
m_doc->updateLayout();
return cmd->valueFn(part);
}
void JSEditor::setSupportsPasteCommand(bool flag)
{
supportsPasteCommand = flag;
}
// =============================================================================================
// Private stuff, all inside an anonymous namespace.
namespace {
bool execStyleChange(KHTMLPart *part, int propertyID, const DOMString &propertyValue)
{
CSSMutableStyleDeclarationImpl *style = new CSSMutableStyleDeclarationImpl;
style->setProperty(propertyID, propertyValue);
style->ref();
part->applyStyle(style);
style->deref();
return true;
}
bool execStyleChange(KHTMLPart *part, int propertyID, const char *propertyValue)
{
return execStyleChange(part, propertyID, DOMString(propertyValue));
}
KHTMLPart::TriState stateStyle(KHTMLPart *part, int propertyID, const char *desiredValue)
{
CSSMutableStyleDeclarationImpl *style = new CSSMutableStyleDeclarationImpl;
style->setProperty(propertyID, desiredValue);
style->ref();
KHTMLPart::TriState state = part->selectionHasStyle(style);
style->deref();
return state;
}
bool selectionStartHasStyle(KHTMLPart *part, int propertyID, const char *desiredValue)
{
CSSMutableStyleDeclarationImpl *style = new CSSMutableStyleDeclarationImpl;
style->setProperty(propertyID, desiredValue);
style->ref();
bool hasStyle = part->selectionStartHasStyle(style);
style->deref();
return hasStyle;
}
DOMString valueStyle(KHTMLPart *part, int propertyID)
{
return part->selectionStartStylePropertyValue(propertyID);
}
// =============================================================================================
//
// execCommand implementations
//
bool execBackColor(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_BACKGROUND_COLOR, value);
}
bool execBold(KHTMLPart *part, bool userInterface, const DOMString &value)
{
bool isBold = selectionStartHasStyle(part, CSS_PROP_FONT_WEIGHT, "bold");
return execStyleChange(part, CSS_PROP_FONT_WEIGHT, isBold ? "normal" : "bold");
}
bool execCopy(KHTMLPart *part, bool userInterface, const DOMString &value)
{
part->copyToPasteboard();
return true;
}
bool execCut(KHTMLPart *part, bool userInterface, const DOMString &value)
{
part->cutToPasteboard();
return true;
}
bool execDelete(KHTMLPart *part, bool userInterface, const DOMString &value)
{
TypingCommand::deleteKeyPressed(part->xmlDocImpl(), part->selectionGranularity() == khtml::WORD);
return true;
}
bool execForwardDelete(KHTMLPart *part, bool userInterface, const DOMString &value)
{
TypingCommand::forwardDeleteKeyPressed(part->xmlDocImpl());
return true;
}
bool execFontName(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_FONT_FAMILY, value);
}
bool execFontSize(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_FONT_SIZE, value);
}
bool execFontSizeDelta(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP__KHTML_FONT_SIZE_DELTA, value);
}
bool execForeColor(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_COLOR, value);
}
bool execIndent(KHTMLPart *part, bool userInterface, const DOMString &value)
{
// FIXME: Implement.
return false;
}
bool execInsertLineBreak(KHTMLPart *part, bool userInterface, const DOMString &value)
{
TypingCommand::insertLineBreak(part->xmlDocImpl());
return true;
}
bool execInsertParagraph(KHTMLPart *part, bool userInterface, const DOMString &value)
{
TypingCommand::insertParagraphSeparator(part->xmlDocImpl());
return true;
}
bool execInsertText(KHTMLPart *part, bool userInterface, const DOMString &value)
{
TypingCommand::insertText(part->xmlDocImpl(), value);
return true;
}
bool execItalic(KHTMLPart *part, bool userInterface, const DOMString &value)
{
bool isItalic = selectionStartHasStyle(part, CSS_PROP_FONT_STYLE, "italic");
return execStyleChange(part, CSS_PROP_FONT_STYLE, isItalic ? "normal" : "italic");
}
bool execJustifyCenter(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "center");
}
bool execJustifyFull(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "justify");
}
bool execJustifyLeft(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "left");
}
bool execJustifyRight(KHTMLPart *part, bool userInterface, const DOMString &value)
{
return execStyleChange(part, CSS_PROP_TEXT_ALIGN, "right");
}
bool execOutdent(KHTMLPart *part, bool userInterface, const DOMString &value)
{
// FIXME: Implement.
return false;
}
bool execPaste(KHTMLPart *part, bool userInterface, const DOMString &value)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -