Misc changes to the nsITextServicesDocument interface.
git-svn-id: svn://10.0.0.236/trunk@28867 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
parent
7b9c8f971d
commit
7fd16575ef
@ -37,79 +37,157 @@ TextServicesDocument interface to outside world
|
||||
|
||||
|
||||
/**
|
||||
* A text services specific interface.
|
||||
* <P>
|
||||
* It's implemented by an object that executes some behavior that must be
|
||||
* tracked by the transaction manager.
|
||||
* The nsITextServicesDocument presents the document in as a
|
||||
* bunch of flattened text blocks. Each text block can be retrieved
|
||||
* as an nsString (array of characters).
|
||||
*/
|
||||
class nsITextServicesDocument : public nsISupports{
|
||||
public:
|
||||
|
||||
static const nsIID& GetIID() { static nsIID iid = NS_ITEXTSERVICESDOCUMENT_IID; return iid; }
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
NS_IMETHOD Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell) = 0;
|
||||
typedef enum { eDSNormal=0, eDSUndlerline } TSDDisplayStyle;
|
||||
|
||||
/**
|
||||
*
|
||||
* Initailizes the text services document to use a particular
|
||||
* DOM document.
|
||||
* @param aDOMDocument is the document to use. It is AddRef'd
|
||||
* by this method.
|
||||
* @param aPresShell is the presentation shell to use when
|
||||
* setting the selection. It is AddRef'd by this method.
|
||||
*/
|
||||
NS_IMETHOD SetEditor(nsIEditor *aEditor) = 0;
|
||||
NS_IMETHOD InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Initializes the text services document to use a particular
|
||||
* editor. The text services document will use the DOM document
|
||||
* and presentation shell used by the editor.
|
||||
* @param aEditor is the editor to use. The editor is AddRef'd
|
||||
* by this method.
|
||||
*/
|
||||
NS_IMETHOD InitWithEditor(nsIEditor *aEditor) = 0;
|
||||
|
||||
/**
|
||||
* Returns true if the document can be modified with calls
|
||||
* to DeleteSelection() and InsertText().
|
||||
* @param aCanEdit is true if the document can be modified,
|
||||
* false if it can't.
|
||||
*/
|
||||
NS_IMETHOD CanEdit(PRBool *aCanEdit) = 0;
|
||||
|
||||
/**
|
||||
* Returns the text in the current text block.
|
||||
* @param aStr will contain the text.
|
||||
*/
|
||||
|
||||
NS_IMETHOD GetCurrentTextBlock(nsString *aStr) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the first text block
|
||||
* in the document. This method does not adjust the current
|
||||
* cursor position or selection.
|
||||
*/
|
||||
|
||||
NS_IMETHOD FirstBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the last text block in the
|
||||
* document. This method does not adjust the current cursor
|
||||
* position or selection.
|
||||
*/
|
||||
|
||||
NS_IMETHOD LastBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the first text block that
|
||||
* contains the current selection or caret.
|
||||
* @param aSelectionOffset will contain the offset into the
|
||||
* string returned by GetCurrentTextBlock() where the selection
|
||||
* begins.
|
||||
* @param aLength will contain the number of characters that are
|
||||
* selected in the string.
|
||||
*/
|
||||
|
||||
NS_IMETHOD FirstSelectedBlock(PRInt32 *aSelectionOffset, PRInt32 *aSelectionLength) = 0;
|
||||
|
||||
/**
|
||||
* Tells the document to point to the last text block that
|
||||
* contains the current selection or caret.
|
||||
* @param aSelectionOffset will contain the offset into the
|
||||
* string returned by GetCurrentTextBlock() where the selection
|
||||
* begins.
|
||||
* @param aLength will contain the number of characters that are
|
||||
* selected in the string.
|
||||
*/
|
||||
|
||||
NS_IMETHOD LastSelectedBlock(PRInt32 *aSelectionOffset, PRInt32 *aSelectionLength) = 0;
|
||||
|
||||
/**
|
||||
* Tells the document to point to the text block before
|
||||
* the current one. This method will return NS_OK, even
|
||||
* if there is no previous block. Callers should call IsDone()
|
||||
* to check if we have gone beyond the first text block in
|
||||
* the document.
|
||||
*/
|
||||
|
||||
NS_IMETHOD PrevBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the text block after
|
||||
* the current one. This method will return NS_OK, even
|
||||
* if there is no next block. Callers should call IsDone()
|
||||
* to check if we have gone beyond the last text block
|
||||
* in the document.
|
||||
*/
|
||||
|
||||
NS_IMETHOD NextBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* IsDone() will always set aIsDone == PR_FALSE unless
|
||||
* the document contains no text, PrevBlock() was called
|
||||
* while the document was already pointing to the first
|
||||
* text block in the document, or NextBlock() was called
|
||||
* while the document was already pointing to the last
|
||||
* text block in the document.
|
||||
* @param aIsDone will contain the result.
|
||||
*/
|
||||
|
||||
NS_IMETHOD IsDone() = 0;
|
||||
NS_IMETHOD IsDone(PRBool *aIsDone) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* SetSelection() allows the caller to set the selection
|
||||
* based on an offset into the string returned by
|
||||
* GetCurrentTextBlock(). A length of zero places the cursor
|
||||
* at that offset. A positive non-zero length "n" selects
|
||||
* n characters in the string.
|
||||
* @param aOffset offset into string returned by GetCurrentTextBlock().
|
||||
* @param aLength number characters selected.
|
||||
*/
|
||||
|
||||
NS_IMETHOD SetSelection(PRInt32 aOffset, PRInt32 aLength) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Deletes the text selected by SetSelection(). Calling
|
||||
* DeleteSelection with nothing selected, or with a collapsed
|
||||
* selection (cursor) does nothing and returns NS_OK.
|
||||
*/
|
||||
|
||||
NS_IMETHOD DeleteSelection() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Inserts the given text at the current cursor position.
|
||||
* If there is a selection, it will be deleted before the
|
||||
* text is inserted.
|
||||
*/
|
||||
|
||||
NS_IMETHOD InsertText(const nsString *aText) = 0;
|
||||
|
||||
/**
|
||||
* Sets the display style for the text selected by SetSelection().
|
||||
* @param aStyle is the style to apply to the selected text.
|
||||
*/
|
||||
|
||||
NS_IMETHOD SetDisplayStyle(TSDDisplayStyle aStyle) = 0;
|
||||
};
|
||||
|
||||
#endif // nsITextServicesDocument_h__
|
||||
|
||||
@ -235,7 +235,7 @@ nsTextServicesDocument::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell)
|
||||
nsTextServicesDocument::InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
@ -257,7 +257,15 @@ nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresSh
|
||||
mPresShell = do_QueryInterface(aPresShell);
|
||||
mDOMDocument = do_QueryInterface(aDOMDocument);
|
||||
|
||||
InitContentIterator();
|
||||
result = InitContentIterator();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = FirstBlock();
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
|
||||
@ -265,7 +273,7 @@ nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresSh
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
nsTextServicesDocument::InitWithEditor(nsIEditor *aEditor)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsCOMPtr<nsIPresShell> presShell;
|
||||
@ -315,7 +323,22 @@ nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
|
||||
if (!mDOMDocument) {
|
||||
mDOMDocument = doc;
|
||||
InitContentIterator();
|
||||
|
||||
result = InitContentIterator();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = FirstBlock();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
mEditor = do_QueryInterface(aEditor);
|
||||
@ -339,6 +362,17 @@ nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::CanEdit(PRBool *aCanEdit)
|
||||
{
|
||||
if (!aCanEdit)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aCanEdit = (mEditor) ? PR_TRUE : PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::GetCurrentTextBlock(nsString *aStr)
|
||||
{
|
||||
@ -436,39 +470,51 @@ nsTextServicesDocument::GetCurrentTextBlock(nsString *aStr)
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::PrevBlock()
|
||||
{
|
||||
nsresult result;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid || mIteratorStatus == nsTextServicesDocument::eNext)
|
||||
switch (mIteratorStatus)
|
||||
{
|
||||
result = FirstTextNodeInPrevBlock();
|
||||
case nsTextServicesDocument::eValid:
|
||||
case nsTextServicesDocument::eNext:
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
result = FirstTextNodeInPrevBlock();
|
||||
|
||||
// XXX: Check to make sure the iterator is pointing
|
||||
// to a valid text block, and set mIteratorStatus
|
||||
// accordingly!
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::ePrev)
|
||||
{
|
||||
// The iterator already points to the previous
|
||||
// block, so don't do anything.
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
// XXX: Check to make sure the iterator is pointing
|
||||
// to a valid text block, and set mIteratorStatus
|
||||
// accordingly!
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::ePrev:
|
||||
|
||||
// The iterator already points to the previous
|
||||
// block, so don't do anything.
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
break;
|
||||
}
|
||||
|
||||
// Keep track of prev and next blocks, just in case
|
||||
// the text service blows away the current block.
|
||||
|
||||
if (eValid)
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid)
|
||||
{
|
||||
result = FindFirstTextNodeInPrevBlock(getter_AddRefs(mPrevTextBlock));
|
||||
result = FindFirstTextNodeInNextBlock(getter_AddRefs(mNextTextBlock));
|
||||
@ -482,39 +528,49 @@ nsTextServicesDocument::PrevBlock()
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::NextBlock()
|
||||
{
|
||||
nsresult result;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid)
|
||||
switch (mIteratorStatus)
|
||||
{
|
||||
result = FirstTextNodeInNextBlock();
|
||||
case nsTextServicesDocument::eValid:
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
result = FirstTextNodeInNextBlock();
|
||||
|
||||
// XXX: check if the iterator is pointing to a text node,
|
||||
// then set mIteratorStatus.
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::eNext)
|
||||
{
|
||||
// The iterator already points to the next block,
|
||||
// so don't do anything to it!
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::ePrev)
|
||||
{
|
||||
// If the iterator is pointing to the previous block,
|
||||
// we know that there is no next text block!
|
||||
// XXX: check if the iterator is pointing to a text node,
|
||||
// then set mIteratorStatus.
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::eNext:
|
||||
|
||||
// The iterator already points to the next block,
|
||||
// so don't do anything to it!
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::ePrev:
|
||||
|
||||
// If the iterator is pointing to the previous block,
|
||||
// we know that there is no next text block! Just
|
||||
// fall through to the default case!
|
||||
|
||||
default:
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
break;
|
||||
}
|
||||
|
||||
// Keep track of prev and next blocks, just in case
|
||||
@ -533,14 +589,36 @@ nsTextServicesDocument::NextBlock()
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::IsDone()
|
||||
nsTextServicesDocument::IsDone(PRBool *aIsDone)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (!aIsDone)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aIsDone = PR_FALSE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
nsresult result = mIterator->IsDone();
|
||||
// XXX: Take into account the iterator status!
|
||||
|
||||
if (mIteratorStatus == eInvalid && !mPrevTextBlock && !mNextTextBlock)
|
||||
{
|
||||
// We have an empty document!
|
||||
*aIsDone = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = mIterator->IsDone();
|
||||
|
||||
if (result != NS_COMFALSE)
|
||||
*aIsDone = PR_TRUE;
|
||||
else
|
||||
result = NS_OK;
|
||||
}
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
|
||||
@ -552,7 +630,7 @@ nsTextServicesDocument::SetSelection(PRInt32 aOffset, PRInt32 aLength)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if ((!mPresShell && !mEditor) || aOffset < 0 || aLength < 0)
|
||||
if (!mPresShell || aOffset < 0 || aLength < 0)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
@ -696,9 +774,9 @@ nsTextServicesDocument::DeleteSelection()
|
||||
LOCK_DOC(this);
|
||||
|
||||
//**** KDEBUG ****
|
||||
printf("\n---- Before Delete\n");
|
||||
printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
PrintOffsetTable();
|
||||
// printf("\n---- Before Delete\n");
|
||||
// printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
// PrintOffsetTable();
|
||||
//**** KDEBUG ****
|
||||
|
||||
PRInt32 i, selLength;
|
||||
@ -888,9 +966,9 @@ nsTextServicesDocument::DeleteSelection()
|
||||
result = RemoveInvalidOffsetEntries();
|
||||
|
||||
//**** KDEBUG ****
|
||||
printf("\n---- After Delete\n");
|
||||
printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
PrintOffsetTable();
|
||||
// printf("\n---- After Delete\n");
|
||||
// printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
// PrintOffsetTable();
|
||||
//**** KDEBUG ****
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
@ -1147,6 +1225,12 @@ nsTextServicesDocument::InsertText(const nsString *aText)
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::SetDisplayStyle(TSDDisplayStyle aStyle)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsTextServicesDocument::InsertNode(nsIDOMNode *aNode,
|
||||
nsIDOMNode *aParent,
|
||||
@ -1755,7 +1839,7 @@ nsTextServicesDocument::SelectionIsValid()
|
||||
return(mSelStartIndex >= 0);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::FirstBlock()
|
||||
{
|
||||
nsresult result;
|
||||
@ -1811,7 +1895,7 @@ nsTextServicesDocument::FirstBlock()
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::LastBlock()
|
||||
{
|
||||
nsresult result;
|
||||
@ -1875,6 +1959,18 @@ nsTextServicesDocument::LastBlock()
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::FirstSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::LastSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsTextServicesDocument::FirstTextNodeInCurrentBlock()
|
||||
{
|
||||
|
||||
@ -97,19 +97,23 @@ public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/* nsITextServicesDocumentInternal method implementations. */
|
||||
NS_IMETHOD Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell);
|
||||
NS_IMETHOD SetEditor(nsIEditor *aEditor);
|
||||
NS_IMETHOD InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell);
|
||||
NS_IMETHOD InitWithEditor(nsIEditor *aEditor);
|
||||
|
||||
/* nsITextServicesDocument method implementations. */
|
||||
NS_IMETHOD CanEdit(PRBool *aCanEdit);
|
||||
NS_IMETHOD GetCurrentTextBlock(nsString *aStr);
|
||||
NS_IMETHOD FirstBlock();
|
||||
NS_IMETHOD LastBlock();
|
||||
NS_IMETHOD FirstSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength);
|
||||
NS_IMETHOD LastSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength);
|
||||
NS_IMETHOD PrevBlock();
|
||||
NS_IMETHOD NextBlock();
|
||||
NS_IMETHOD IsDone();
|
||||
NS_IMETHOD IsDone(PRBool *aIsDone);
|
||||
NS_IMETHOD SetSelection(PRInt32 aOffset, PRInt32 aLength);
|
||||
NS_IMETHOD DeleteSelection();
|
||||
NS_IMETHOD InsertText(const nsString *aText);
|
||||
NS_IMETHOD SetDisplayStyle(TSDDisplayStyle aStyle);
|
||||
|
||||
/* nsIEditActionListener method implementations. */
|
||||
nsresult InsertNode(nsIDOMNode * aNode,
|
||||
|
||||
@ -37,79 +37,157 @@ TextServicesDocument interface to outside world
|
||||
|
||||
|
||||
/**
|
||||
* A text services specific interface.
|
||||
* <P>
|
||||
* It's implemented by an object that executes some behavior that must be
|
||||
* tracked by the transaction manager.
|
||||
* The nsITextServicesDocument presents the document in as a
|
||||
* bunch of flattened text blocks. Each text block can be retrieved
|
||||
* as an nsString (array of characters).
|
||||
*/
|
||||
class nsITextServicesDocument : public nsISupports{
|
||||
public:
|
||||
|
||||
static const nsIID& GetIID() { static nsIID iid = NS_ITEXTSERVICESDOCUMENT_IID; return iid; }
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
NS_IMETHOD Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell) = 0;
|
||||
typedef enum { eDSNormal=0, eDSUndlerline } TSDDisplayStyle;
|
||||
|
||||
/**
|
||||
*
|
||||
* Initailizes the text services document to use a particular
|
||||
* DOM document.
|
||||
* @param aDOMDocument is the document to use. It is AddRef'd
|
||||
* by this method.
|
||||
* @param aPresShell is the presentation shell to use when
|
||||
* setting the selection. It is AddRef'd by this method.
|
||||
*/
|
||||
NS_IMETHOD SetEditor(nsIEditor *aEditor) = 0;
|
||||
NS_IMETHOD InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Initializes the text services document to use a particular
|
||||
* editor. The text services document will use the DOM document
|
||||
* and presentation shell used by the editor.
|
||||
* @param aEditor is the editor to use. The editor is AddRef'd
|
||||
* by this method.
|
||||
*/
|
||||
NS_IMETHOD InitWithEditor(nsIEditor *aEditor) = 0;
|
||||
|
||||
/**
|
||||
* Returns true if the document can be modified with calls
|
||||
* to DeleteSelection() and InsertText().
|
||||
* @param aCanEdit is true if the document can be modified,
|
||||
* false if it can't.
|
||||
*/
|
||||
NS_IMETHOD CanEdit(PRBool *aCanEdit) = 0;
|
||||
|
||||
/**
|
||||
* Returns the text in the current text block.
|
||||
* @param aStr will contain the text.
|
||||
*/
|
||||
|
||||
NS_IMETHOD GetCurrentTextBlock(nsString *aStr) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the first text block
|
||||
* in the document. This method does not adjust the current
|
||||
* cursor position or selection.
|
||||
*/
|
||||
|
||||
NS_IMETHOD FirstBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the last text block in the
|
||||
* document. This method does not adjust the current cursor
|
||||
* position or selection.
|
||||
*/
|
||||
|
||||
NS_IMETHOD LastBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the first text block that
|
||||
* contains the current selection or caret.
|
||||
* @param aSelectionOffset will contain the offset into the
|
||||
* string returned by GetCurrentTextBlock() where the selection
|
||||
* begins.
|
||||
* @param aLength will contain the number of characters that are
|
||||
* selected in the string.
|
||||
*/
|
||||
|
||||
NS_IMETHOD FirstSelectedBlock(PRInt32 *aSelectionOffset, PRInt32 *aSelectionLength) = 0;
|
||||
|
||||
/**
|
||||
* Tells the document to point to the last text block that
|
||||
* contains the current selection or caret.
|
||||
* @param aSelectionOffset will contain the offset into the
|
||||
* string returned by GetCurrentTextBlock() where the selection
|
||||
* begins.
|
||||
* @param aLength will contain the number of characters that are
|
||||
* selected in the string.
|
||||
*/
|
||||
|
||||
NS_IMETHOD LastSelectedBlock(PRInt32 *aSelectionOffset, PRInt32 *aSelectionLength) = 0;
|
||||
|
||||
/**
|
||||
* Tells the document to point to the text block before
|
||||
* the current one. This method will return NS_OK, even
|
||||
* if there is no previous block. Callers should call IsDone()
|
||||
* to check if we have gone beyond the first text block in
|
||||
* the document.
|
||||
*/
|
||||
|
||||
NS_IMETHOD PrevBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Tells the document to point to the text block after
|
||||
* the current one. This method will return NS_OK, even
|
||||
* if there is no next block. Callers should call IsDone()
|
||||
* to check if we have gone beyond the last text block
|
||||
* in the document.
|
||||
*/
|
||||
|
||||
NS_IMETHOD NextBlock() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* IsDone() will always set aIsDone == PR_FALSE unless
|
||||
* the document contains no text, PrevBlock() was called
|
||||
* while the document was already pointing to the first
|
||||
* text block in the document, or NextBlock() was called
|
||||
* while the document was already pointing to the last
|
||||
* text block in the document.
|
||||
* @param aIsDone will contain the result.
|
||||
*/
|
||||
|
||||
NS_IMETHOD IsDone() = 0;
|
||||
NS_IMETHOD IsDone(PRBool *aIsDone) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* SetSelection() allows the caller to set the selection
|
||||
* based on an offset into the string returned by
|
||||
* GetCurrentTextBlock(). A length of zero places the cursor
|
||||
* at that offset. A positive non-zero length "n" selects
|
||||
* n characters in the string.
|
||||
* @param aOffset offset into string returned by GetCurrentTextBlock().
|
||||
* @param aLength number characters selected.
|
||||
*/
|
||||
|
||||
NS_IMETHOD SetSelection(PRInt32 aOffset, PRInt32 aLength) = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Deletes the text selected by SetSelection(). Calling
|
||||
* DeleteSelection with nothing selected, or with a collapsed
|
||||
* selection (cursor) does nothing and returns NS_OK.
|
||||
*/
|
||||
|
||||
NS_IMETHOD DeleteSelection() = 0;
|
||||
|
||||
/**
|
||||
*
|
||||
* Inserts the given text at the current cursor position.
|
||||
* If there is a selection, it will be deleted before the
|
||||
* text is inserted.
|
||||
*/
|
||||
|
||||
NS_IMETHOD InsertText(const nsString *aText) = 0;
|
||||
|
||||
/**
|
||||
* Sets the display style for the text selected by SetSelection().
|
||||
* @param aStyle is the style to apply to the selected text.
|
||||
*/
|
||||
|
||||
NS_IMETHOD SetDisplayStyle(TSDDisplayStyle aStyle) = 0;
|
||||
};
|
||||
|
||||
#endif // nsITextServicesDocument_h__
|
||||
|
||||
@ -235,7 +235,7 @@ nsTextServicesDocument::QueryInterface(REFNSIID aIID, void** aInstancePtr)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell)
|
||||
nsTextServicesDocument::InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
@ -257,7 +257,15 @@ nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresSh
|
||||
mPresShell = do_QueryInterface(aPresShell);
|
||||
mDOMDocument = do_QueryInterface(aDOMDocument);
|
||||
|
||||
InitContentIterator();
|
||||
result = InitContentIterator();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = FirstBlock();
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
|
||||
@ -265,7 +273,7 @@ nsTextServicesDocument::Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresSh
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
nsTextServicesDocument::InitWithEditor(nsIEditor *aEditor)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
nsCOMPtr<nsIPresShell> presShell;
|
||||
@ -315,7 +323,22 @@ nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
|
||||
if (!mDOMDocument) {
|
||||
mDOMDocument = doc;
|
||||
InitContentIterator();
|
||||
|
||||
result = InitContentIterator();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = FirstBlock();
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
mEditor = do_QueryInterface(aEditor);
|
||||
@ -339,6 +362,17 @@ nsTextServicesDocument::SetEditor(nsIEditor *aEditor)
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::CanEdit(PRBool *aCanEdit)
|
||||
{
|
||||
if (!aCanEdit)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aCanEdit = (mEditor) ? PR_TRUE : PR_FALSE;
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::GetCurrentTextBlock(nsString *aStr)
|
||||
{
|
||||
@ -436,39 +470,51 @@ nsTextServicesDocument::GetCurrentTextBlock(nsString *aStr)
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::PrevBlock()
|
||||
{
|
||||
nsresult result;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid || mIteratorStatus == nsTextServicesDocument::eNext)
|
||||
switch (mIteratorStatus)
|
||||
{
|
||||
result = FirstTextNodeInPrevBlock();
|
||||
case nsTextServicesDocument::eValid:
|
||||
case nsTextServicesDocument::eNext:
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
result = FirstTextNodeInPrevBlock();
|
||||
|
||||
// XXX: Check to make sure the iterator is pointing
|
||||
// to a valid text block, and set mIteratorStatus
|
||||
// accordingly!
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::ePrev)
|
||||
{
|
||||
// The iterator already points to the previous
|
||||
// block, so don't do anything.
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
// XXX: Check to make sure the iterator is pointing
|
||||
// to a valid text block, and set mIteratorStatus
|
||||
// accordingly!
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::ePrev:
|
||||
|
||||
// The iterator already points to the previous
|
||||
// block, so don't do anything.
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
break;
|
||||
}
|
||||
|
||||
// Keep track of prev and next blocks, just in case
|
||||
// the text service blows away the current block.
|
||||
|
||||
if (eValid)
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid)
|
||||
{
|
||||
result = FindFirstTextNodeInPrevBlock(getter_AddRefs(mPrevTextBlock));
|
||||
result = FindFirstTextNodeInNextBlock(getter_AddRefs(mNextTextBlock));
|
||||
@ -482,39 +528,49 @@ nsTextServicesDocument::PrevBlock()
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::NextBlock()
|
||||
{
|
||||
nsresult result;
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
if (mIteratorStatus == nsTextServicesDocument::eValid)
|
||||
switch (mIteratorStatus)
|
||||
{
|
||||
result = FirstTextNodeInNextBlock();
|
||||
case nsTextServicesDocument::eValid:
|
||||
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
result = FirstTextNodeInNextBlock();
|
||||
|
||||
// XXX: check if the iterator is pointing to a text node,
|
||||
// then set mIteratorStatus.
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::eNext)
|
||||
{
|
||||
// The iterator already points to the next block,
|
||||
// so don't do anything to it!
|
||||
if (NS_FAILED(result))
|
||||
{
|
||||
UNLOCK_DOC(this);
|
||||
return result;
|
||||
}
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
}
|
||||
else if (mIteratorStatus == nsTextServicesDocument::ePrev)
|
||||
{
|
||||
// If the iterator is pointing to the previous block,
|
||||
// we know that there is no next text block!
|
||||
// XXX: check if the iterator is pointing to a text node,
|
||||
// then set mIteratorStatus.
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::eNext:
|
||||
|
||||
// The iterator already points to the next block,
|
||||
// so don't do anything to it!
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eValid;
|
||||
break;
|
||||
|
||||
case nsTextServicesDocument::ePrev:
|
||||
|
||||
// If the iterator is pointing to the previous block,
|
||||
// we know that there is no next text block! Just
|
||||
// fall through to the default case!
|
||||
|
||||
default:
|
||||
|
||||
mIteratorStatus = nsTextServicesDocument::eInvalid;
|
||||
break;
|
||||
}
|
||||
|
||||
// Keep track of prev and next blocks, just in case
|
||||
@ -533,14 +589,36 @@ nsTextServicesDocument::NextBlock()
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::IsDone()
|
||||
nsTextServicesDocument::IsDone(PRBool *aIsDone)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if (!mIterator)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
if (!aIsDone)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*aIsDone = PR_FALSE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
|
||||
nsresult result = mIterator->IsDone();
|
||||
// XXX: Take into account the iterator status!
|
||||
|
||||
if (mIteratorStatus == eInvalid && !mPrevTextBlock && !mNextTextBlock)
|
||||
{
|
||||
// We have an empty document!
|
||||
*aIsDone = PR_TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
result = mIterator->IsDone();
|
||||
|
||||
if (result != NS_COMFALSE)
|
||||
*aIsDone = PR_TRUE;
|
||||
else
|
||||
result = NS_OK;
|
||||
}
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
|
||||
@ -552,7 +630,7 @@ nsTextServicesDocument::SetSelection(PRInt32 aOffset, PRInt32 aLength)
|
||||
{
|
||||
nsresult result = NS_OK;
|
||||
|
||||
if ((!mPresShell && !mEditor) || aOffset < 0 || aLength < 0)
|
||||
if (!mPresShell || aOffset < 0 || aLength < 0)
|
||||
return NS_ERROR_FAILURE;
|
||||
|
||||
LOCK_DOC(this);
|
||||
@ -696,9 +774,9 @@ nsTextServicesDocument::DeleteSelection()
|
||||
LOCK_DOC(this);
|
||||
|
||||
//**** KDEBUG ****
|
||||
printf("\n---- Before Delete\n");
|
||||
printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
PrintOffsetTable();
|
||||
// printf("\n---- Before Delete\n");
|
||||
// printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
// PrintOffsetTable();
|
||||
//**** KDEBUG ****
|
||||
|
||||
PRInt32 i, selLength;
|
||||
@ -888,9 +966,9 @@ nsTextServicesDocument::DeleteSelection()
|
||||
result = RemoveInvalidOffsetEntries();
|
||||
|
||||
//**** KDEBUG ****
|
||||
printf("\n---- After Delete\n");
|
||||
printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
PrintOffsetTable();
|
||||
// printf("\n---- After Delete\n");
|
||||
// printf("Sel: (%2d, %4d) (%2d, %4d)\n", mSelStartIndex, mSelStartOffset, mSelEndIndex, mSelEndOffset);
|
||||
// PrintOffsetTable();
|
||||
//**** KDEBUG ****
|
||||
|
||||
UNLOCK_DOC(this);
|
||||
@ -1147,6 +1225,12 @@ nsTextServicesDocument::InsertText(const nsString *aText)
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::SetDisplayStyle(TSDDisplayStyle aStyle)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsTextServicesDocument::InsertNode(nsIDOMNode *aNode,
|
||||
nsIDOMNode *aParent,
|
||||
@ -1755,7 +1839,7 @@ nsTextServicesDocument::SelectionIsValid()
|
||||
return(mSelStartIndex >= 0);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::FirstBlock()
|
||||
{
|
||||
nsresult result;
|
||||
@ -1811,7 +1895,7 @@ nsTextServicesDocument::FirstBlock()
|
||||
return result;
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::LastBlock()
|
||||
{
|
||||
nsresult result;
|
||||
@ -1875,6 +1959,18 @@ nsTextServicesDocument::LastBlock()
|
||||
return result;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::FirstSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextServicesDocument::LastSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength)
|
||||
{
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsTextServicesDocument::FirstTextNodeInCurrentBlock()
|
||||
{
|
||||
|
||||
@ -97,19 +97,23 @@ public:
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
/* nsITextServicesDocumentInternal method implementations. */
|
||||
NS_IMETHOD Init(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell);
|
||||
NS_IMETHOD SetEditor(nsIEditor *aEditor);
|
||||
NS_IMETHOD InitWithDocument(nsIDOMDocument *aDOMDocument, nsIPresShell *aPresShell);
|
||||
NS_IMETHOD InitWithEditor(nsIEditor *aEditor);
|
||||
|
||||
/* nsITextServicesDocument method implementations. */
|
||||
NS_IMETHOD CanEdit(PRBool *aCanEdit);
|
||||
NS_IMETHOD GetCurrentTextBlock(nsString *aStr);
|
||||
NS_IMETHOD FirstBlock();
|
||||
NS_IMETHOD LastBlock();
|
||||
NS_IMETHOD FirstSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength);
|
||||
NS_IMETHOD LastSelectedBlock(PRInt32 *aSelOffset, PRInt32 *aSelLength);
|
||||
NS_IMETHOD PrevBlock();
|
||||
NS_IMETHOD NextBlock();
|
||||
NS_IMETHOD IsDone();
|
||||
NS_IMETHOD IsDone(PRBool *aIsDone);
|
||||
NS_IMETHOD SetSelection(PRInt32 aOffset, PRInt32 aLength);
|
||||
NS_IMETHOD DeleteSelection();
|
||||
NS_IMETHOD InsertText(const nsString *aText);
|
||||
NS_IMETHOD SetDisplayStyle(TSDDisplayStyle aStyle);
|
||||
|
||||
/* nsIEditActionListener method implementations. */
|
||||
nsresult InsertNode(nsIDOMNode * aNode,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user