18033: Add editor API for delete methods, and hook up an initial

set of emacs key bindings for Unix.  r=jfrancis
This commit is contained in:
akkana%netscape.com 1999-11-25 04:11:51 +00:00
Родитель c8fe63ef47
Коммит 757b1fce03
10 изменённых файлов: 221 добавлений и 20 удалений

Просмотреть файл

@ -4413,6 +4413,11 @@ nsEditor::CreateTxnForDeleteInsertionPoint(nsIDOMRange *aRange,
aAction, aAction,
EditAggregateTxn *aTxn) EditAggregateTxn *aTxn)
{ {
// We haven't implemented these three modes yet:
if (aAction == eDeleteNextWord || aAction == eDeletePreviousWord
|| aAction == eDeleteToEndOfLine)
return NS_ERROR_NOT_IMPLEMENTED;
nsCOMPtr<nsIDOMNode> node; nsCOMPtr<nsIDOMNode> node;
PRBool isFirst; PRBool isFirst;
PRBool isLast; PRBool isLast;

Просмотреть файл

@ -377,7 +377,6 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl)
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// get the URL of the page we are editing // get the URL of the page we are editing
char* pageURLString = nsnull;
if (aUrl) if (aUrl)
{ {
char* pageURLString = nsnull; char* pageURLString = nsnull;
@ -654,6 +653,73 @@ nsEditorShell::UpdateInterfaceState(void)
return mStateMaintainer->ForceUpdate(); return mStateMaintainer->ForceUpdate();
} }
// Deletion routines
nsresult
nsEditorShell::ScrollSelectionIntoView()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIPresShell> presShell;
nsresult result = editor->GetPresShell(getter_AddRefs(presShell));
if (NS_FAILED(result))
return result;
if (!presShell)
return NS_ERROR_NULL_POINTER;
return presShell->ScrollSelectionIntoView(SELECTION_NORMAL,
SELECTION_FOCUS_REGION);
}
NS_IMETHODIMP
nsEditorShell::DeleteCharForward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteNext);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteCharBackward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeletePrevious);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteWordForward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteNextWord);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteWordBackward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeletePreviousWord);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteToEndOfLine()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteToEndOfLine);
ScrollSelectionIntoView();
return rv;
}
// Generic attribute setting and removal // Generic attribute setting and removal
NS_IMETHODIMP NS_IMETHODIMP
nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const PRUnichar *value) nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const PRUnichar *value)

Просмотреть файл

@ -126,6 +126,7 @@ class nsEditorShell : public nsIEditorShell,
NS_IMETHOD DoEditorMode(nsIWebShell *aWebShell); NS_IMETHOD DoEditorMode(nsIWebShell *aWebShell);
NS_IMETHOD ExecuteScript(nsIScriptContext * aContext, const nsString& aScript); NS_IMETHOD ExecuteScript(nsIScriptContext * aContext, const nsString& aScript);
NS_IMETHOD InstantiateEditor(nsIDOMDocument *aDoc, nsIPresShell *aPresShell); NS_IMETHOD InstantiateEditor(nsIDOMDocument *aDoc, nsIPresShell *aPresShell);
NS_IMETHOD ScrollSelectionIntoView();
NS_IMETHOD TransferDocumentStateListeners(); NS_IMETHOD TransferDocumentStateListeners();
NS_IMETHOD RemoveOneProperty(const nsString& aProp, const nsString& aAttr); NS_IMETHOD RemoveOneProperty(const nsString& aProp, const nsString& aAttr);
void SetButtonImage(nsIDOMNode * aParentNode, PRInt32 aBtnNum, const nsString &aResName); void SetButtonImage(nsIDOMNode * aParentNode, PRInt32 aBtnNum, const nsString &aResName);

Просмотреть файл

@ -377,7 +377,6 @@ nsEditorShell::PrepareDocumentForEditing(nsIURI *aUrl)
if (NS_FAILED(rv)) return rv; if (NS_FAILED(rv)) return rv;
// get the URL of the page we are editing // get the URL of the page we are editing
char* pageURLString = nsnull;
if (aUrl) if (aUrl)
{ {
char* pageURLString = nsnull; char* pageURLString = nsnull;
@ -654,6 +653,73 @@ nsEditorShell::UpdateInterfaceState(void)
return mStateMaintainer->ForceUpdate(); return mStateMaintainer->ForceUpdate();
} }
// Deletion routines
nsresult
nsEditorShell::ScrollSelectionIntoView()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsCOMPtr<nsIPresShell> presShell;
nsresult result = editor->GetPresShell(getter_AddRefs(presShell));
if (NS_FAILED(result))
return result;
if (!presShell)
return NS_ERROR_NULL_POINTER;
return presShell->ScrollSelectionIntoView(SELECTION_NORMAL,
SELECTION_FOCUS_REGION);
}
NS_IMETHODIMP
nsEditorShell::DeleteCharForward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteNext);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteCharBackward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeletePrevious);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteWordForward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteNextWord);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteWordBackward()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeletePreviousWord);
ScrollSelectionIntoView();
return rv;
}
NS_IMETHODIMP
nsEditorShell::DeleteToEndOfLine()
{
nsCOMPtr<nsIEditor> editor = do_QueryInterface(mEditor);
if (!editor) return NS_ERROR_NOT_INITIALIZED;
nsresult rv = editor->DeleteSelection(nsIEditor::eDeleteToEndOfLine);
ScrollSelectionIntoView();
return rv;
}
// Generic attribute setting and removal // Generic attribute setting and removal
NS_IMETHODIMP NS_IMETHODIMP
nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const PRUnichar *value) nsEditorShell::SetAttribute(nsIDOMElement *element, const PRUnichar *attr, const PRUnichar *value)

Просмотреть файл

@ -126,6 +126,7 @@ class nsEditorShell : public nsIEditorShell,
NS_IMETHOD DoEditorMode(nsIWebShell *aWebShell); NS_IMETHOD DoEditorMode(nsIWebShell *aWebShell);
NS_IMETHOD ExecuteScript(nsIScriptContext * aContext, const nsString& aScript); NS_IMETHOD ExecuteScript(nsIScriptContext * aContext, const nsString& aScript);
NS_IMETHOD InstantiateEditor(nsIDOMDocument *aDoc, nsIPresShell *aPresShell); NS_IMETHOD InstantiateEditor(nsIDOMDocument *aDoc, nsIPresShell *aPresShell);
NS_IMETHOD ScrollSelectionIntoView();
NS_IMETHOD TransferDocumentStateListeners(); NS_IMETHOD TransferDocumentStateListeners();
NS_IMETHOD RemoveOneProperty(const nsString& aProp, const nsString& aAttr); NS_IMETHOD RemoveOneProperty(const nsString& aProp, const nsString& aAttr);
void SetButtonImage(nsIDOMNode * aParentNode, PRInt32 aBtnNum, const nsString &aResName); void SetButtonImage(nsIDOMNode * aParentNode, PRInt32 aBtnNum, const nsString &aResName);

Просмотреть файл

@ -266,6 +266,15 @@ interface nsIEditorShell : nsISupports
*/ */
void DeleteElement(in nsIDOMElement element); void DeleteElement(in nsIDOMElement element);
/**
* Deletion methods which need to be accessible to JS:
*/
void DeleteCharForward();
void DeleteCharBackward();
void DeleteWordForward();
void DeleteWordBackward();
void DeleteToEndOfLine();
void SelectElement(in nsIDOMElement element); void SelectElement(in nsIDOMElement element);
void SetSelectionAfterElement(in nsIDOMElement element); void SetSelectionAfterElement(in nsIDOMElement element);

Просмотреть файл

@ -4413,6 +4413,11 @@ nsEditor::CreateTxnForDeleteInsertionPoint(nsIDOMRange *aRange,
aAction, aAction,
EditAggregateTxn *aTxn) EditAggregateTxn *aTxn)
{ {
// We haven't implemented these three modes yet:
if (aAction == eDeleteNextWord || aAction == eDeletePreviousWord
|| aAction == eDeleteToEndOfLine)
return NS_ERROR_NOT_IMPLEMENTED;
nsCOMPtr<nsIDOMNode> node; nsCOMPtr<nsIDOMNode> node;
PRBool isFirst; PRBool isFirst;
PRBool isLast; PRBool isLast;

Просмотреть файл

@ -54,7 +54,10 @@ public:
typedef enum { typedef enum {
eDoNothing, eDoNothing,
eDeleteNext, eDeleteNext,
eDeletePrevious eDeletePrevious,
eDeleteNextWord,
eDeletePreviousWord,
eDeleteToEndOfLine
} ESelectionCollapseDirection; } ESelectionCollapseDirection;

Просмотреть файл

@ -213,6 +213,33 @@ function EditorShutdown()
} }
// -------------------------- Key Bindings -------------------------
function EditorDeleteCharForward()
{
editorShell.DeleteCharForward();
}
function EditorDeleteCharBackward()
{
editorShell.DeleteCharBackward();
}
function EditorDeleteWordForward()
{
editorShell.DeleteWordForward();
}
function EditorDeleteWordBackward()
{
editorShell.DeleteWordBackward();
}
function EditorDeleteToEndOfLine()
{
editorShell.DeleteToEndOfLine();
}
// --------------------------- File menu --------------------------- // --------------------------- File menu ---------------------------
function EditorOpen() function EditorOpen()

Просмотреть файл

@ -8,24 +8,42 @@
xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<!-- change the xul key for Unix --> <!-- change the xul key for Unix -->
<keyset id="defaultKeySet"> <keyset id="defaultKeySet">
<xulkey key="alt" /> <xulkey key="alt" />
</keyset>
<!-- close --> <!-- emacs delete keys -->
<menuitem id="menu_close" value="&closeCmd.label;" key="key_close" accesskey="&closeCmd.accesskey;" observes="cmd_close"/> <key id="emacsbackspacekb" key="h" control="true" onkeypress="EditorDeleteCharBackward()" />
<key id="key_close" xulkey="true" key="&closeCmd.key;" observes="cmd_close"/> <key id="emacsdeletekb" key="d" control="true" onkeypress="EditorDeleteCharForward()" />
<key id="emacsdeletewordbackwardkb" key="w" control="true" onkeypress="EditorDeleteWordBackward()" />
<key id="emacskilltoendkb" key="k" control="true" onkeypress="EditorDeleteToEndOfLine()" />
<!-- emacs motion keys -->
<!-- These are still waiting on the selection controller API -->
<key id="emacsbolkb" key="a" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacseolkb" key="e" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacsbackkb" key="b" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacsforwardkb" key="f" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacsupkb" key="p" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacsdownkb" key="n" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacspagedownkb" key="v" control="true" onkeypress="_EditorNotImplemented()" />
<key id="emacspageupkb" key="v" meta="true" onkeypress="_EditorNotImplemented()" />
</keyset>
<!-- close -->
<menuitem id="menu_close" value="&closeCmd.label;" key="key_close" accesskey="&closeCmd.accesskey;" observes="cmd_close"/>
<key id="key_close" xulkey="true" key="&closeCmd.key;" observes="cmd_close"/>
<!-- quit -->
<menupopup id="menu_FilePopup">
<menuitem value="&quitApplicationCmd.label;" key="key_quit" accesskey="&quitApplicationCmd.accesskey;" observes="cmd_quit"/>
</menupopup>
<key id="key_quit" xulkey="true" key="&quitApplicationCmd.key;" observes="cmd_quit"/>
<broadcaster id="cmd_quit" oncommand="goQuitApplication()"/>
<!-- quit --> <!-- Edit Menu -->
<menupopup id="menu_FilePopup"> <menuitem id="menu_redo" value="&redoCmd.label;" key="key_redo" accesskey="&redoCmd.accesskey;" observes="cmd_redo"/>
<menuitem value="&quitApplicationCmd.label;" key="key_quit" accesskey="&quitApplicationCmd.accesskey;" observes="cmd_quit"/> <key id="key_redo" xulkey="true" shift="true" key="&redoCmd.key;" observes="cmd_redo"/>
</menupopup>
<key id="key_quit" xulkey="true" key="&quitApplicationCmd.key;" observes="cmd_quit"/>
<broadcaster id="cmd_quit" oncommand="goQuitApplication()"/>
<!-- Edit Menu -->
<menuitem id="menu_redo" value="&redoCmd.label;" key="key_redo" accesskey="&redoCmd.accesskey;" observes="cmd_redo"/>
<key id="key_redo" xulkey="true" shift="true" key="&redoCmd.key;" observes="cmd_redo"/>
</overlay> </overlay>