1998-03-28 02:44:41 +00:00
|
|
|
/* -*- 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.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "CEditDictionary.h"
|
|
|
|
#include "CLargeEditField.h" // msg_EditField2
|
|
|
|
#include "LGAPushButton.h"
|
|
|
|
#include "resgui.h" // msg_Help
|
|
|
|
#include "macutil.h" // ShowHelp
|
|
|
|
#include "CSpellChecker.h" // ISpellChecker
|
|
|
|
|
|
|
|
// need to include "ntypes.h" before "xp_help.h" because
|
|
|
|
// "xp_help.h" doesn't include definition of MWContext though it should
|
|
|
|
#include "ntypes.h"
|
|
|
|
#include "xp_help.h" // HELP_SPELL_CHECK
|
|
|
|
|
|
|
|
// If user has changed the word field, figure out the length and enable/disable appropriately
|
|
|
|
void CEditDictionary::ListenToMessage ( MessageT inMessage,
|
|
|
|
void* ioParam ) {
|
|
|
|
|
|
|
|
Assert_(mWordNameField);
|
|
|
|
Assert_(mAddButton);
|
|
|
|
|
|
|
|
// This happens when user types
|
|
|
|
if (inMessage == msg_EditField2) {
|
|
|
|
if ((**(mWordNameField->GetMacTEH())).teLength) {
|
|
|
|
mAddButton->Enable();
|
|
|
|
} else {
|
|
|
|
mAddButton->Disable();
|
|
|
|
}
|
|
|
|
|
|
|
|
// User clicked in words table
|
|
|
|
} else if (inMessage == WordsTableID) {
|
|
|
|
|
|
|
|
Boolean atleastoneselected = false;
|
|
|
|
// Must have at least one cell selected for remove to be valid
|
|
|
|
STableCell selchecker(0,0);
|
|
|
|
if (mWordsView->GetNextSelectedCell(selchecker)) {
|
|
|
|
atleastoneselected = true;
|
|
|
|
mRemoveButton->Enable();
|
|
|
|
} else {
|
|
|
|
mRemoveButton->Disable();
|
|
|
|
}
|
|
|
|
// Replace is enabled if there is a valid word in New Word Edit Field
|
|
|
|
// And exactly one word is selected
|
|
|
|
if ((**(mWordNameField->GetMacTEH())).teLength && atleastoneselected &&
|
|
|
|
!mWordsView->GetNextSelectedCell(selchecker) ) {
|
|
|
|
mReplaceButton->Enable();
|
|
|
|
} else {
|
|
|
|
mReplaceButton->Disable();
|
|
|
|
}
|
|
|
|
|
|
|
|
// User left words table
|
|
|
|
} else if (inMessage == msg_LeaveDictionaryTable) {
|
|
|
|
mRemoveButton->Disable();
|
|
|
|
mReplaceButton->Disable();
|
|
|
|
|
|
|
|
// If user clicks on Remove Button
|
|
|
|
} else if (inMessage == RemoveButtonID) {
|
|
|
|
RemoveSelectedWords();
|
|
|
|
|
|
|
|
// If user clicks on Replace Button
|
|
|
|
} else if (inMessage == ReplaceButtonID) {
|
|
|
|
ReplaceSelectedWord();
|
|
|
|
|
|
|
|
// If user clicks on OK Button
|
|
|
|
} else if (inMessage == msg_OK) {
|
|
|
|
MakeDictionaryChangesPermanent();
|
|
|
|
AttemptClose();
|
|
|
|
|
|
|
|
// If user clicks on Cancel Button
|
|
|
|
} else if (inMessage == msg_Cancel) {
|
|
|
|
AttemptClose();
|
|
|
|
|
|
|
|
// User clicks on Help Button
|
|
|
|
} else if (inMessage == msg_Help) {
|
|
|
|
ShowHelp(HELP_SPELL_CHECK);
|
|
|
|
|
|
|
|
// This is the case when something important happens (selection, deselection, etc.)
|
|
|
|
// to the New Word edit field. Check status of word
|
|
|
|
} else if (inMessage == WordID) {
|
|
|
|
if ((**(mWordNameField->GetMacTEH())).teLength) {
|
|
|
|
mAddButton->Enable();
|
|
|
|
} else {
|
|
|
|
mAddButton->Disable();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add word to dictionary
|
|
|
|
} else if (inMessage == AddButtonID) {
|
|
|
|
AddNewWord();
|
|
|
|
} else {
|
|
|
|
LGADialogBox::ListenToMessage(inMessage, ioParam);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::MakeDictionaryChangesPermanent
|
|
|
|
// Take words in view and set in dictionary
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionary::MakeDictionaryChangesPermanent() {
|
|
|
|
|
|
|
|
STableCell currCellLoc(1,1);
|
|
|
|
Str255 currCellData;
|
1998-09-29 17:20:41 +00:00
|
|
|
Uint32 maxsize = 255;
|
1998-03-28 02:44:41 +00:00
|
|
|
|
|
|
|
mISpellChecker->ResetPersonalDictionary();
|
|
|
|
for (currCellLoc.row = 1; currCellLoc.row <= mNumWords; currCellLoc.row++) {
|
|
|
|
maxsize = 255;
|
|
|
|
mWordsView->GetCellData(currCellLoc, currCellData, maxsize);
|
|
|
|
mISpellChecker->AddWordToPersonalDictionary(p2cstr(currCellData));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::RemoveSelectedWord
|
|
|
|
// Remove words that are currently selected
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionary::RemoveSelectedWords() {
|
|
|
|
|
|
|
|
STableCell currCellLoc(0,0);
|
|
|
|
int rowstodelete = 0;
|
|
|
|
|
|
|
|
while (mWordsView->GetNextSelectedCell(currCellLoc)) {
|
|
|
|
rowstodelete++;
|
|
|
|
}
|
|
|
|
currCellLoc = mWordsView->GetFirstSelectedCell();
|
|
|
|
mWordsView->RemoveRows(rowstodelete, currCellLoc.row, true);
|
|
|
|
mNumWords-=rowstodelete;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::ReplaceSelectedWord
|
|
|
|
// Remove currently selected word with word in New Word box
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionary::ReplaceSelectedWord() {
|
|
|
|
|
|
|
|
STableCell currCellLoc;
|
|
|
|
Str255 theWord;
|
|
|
|
|
|
|
|
mWordNameField->GetDescriptor(theWord);
|
|
|
|
currCellLoc = mWordsView->GetFirstSelectedCell();
|
|
|
|
if (mWordsView->IsValidCell(currCellLoc)) {
|
|
|
|
mWordsView->SetCellData(currCellLoc, theWord, theWord[0] + 1);
|
|
|
|
mWordsView->RefreshCell(currCellLoc);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::AddNewWord
|
|
|
|
// Add the word in "New Word" edit field to personal dictionary
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionary::AddNewWord() {
|
|
|
|
|
|
|
|
Str255 theWord;
|
|
|
|
Str255 currWord;
|
|
|
|
Assert_(mWordNameField);
|
|
|
|
Assert_(mISpellChecker);
|
|
|
|
|
|
|
|
STableCell cell(1,1);
|
|
|
|
Uint32 maxbytes;
|
|
|
|
|
|
|
|
mWordNameField->GetDescriptor(theWord);
|
|
|
|
|
|
|
|
/*
|
|
|
|
Check to make sure word is not already in the list. If it is, then highlight that word
|
|
|
|
and return so we don't insert.
|
|
|
|
*/
|
|
|
|
for (cell.row = 1; cell.row <= mNumWords; cell.row++) {
|
|
|
|
maxbytes = 255;
|
|
|
|
mWordsView->GetCellData(cell, currWord, maxbytes);
|
|
|
|
if (currWord[0] == theWord[0] &&
|
|
|
|
!strncmp(reinterpret_cast<const char *>(&(currWord[1])), reinterpret_cast<const char *>(&(theWord[1])), theWord[0]) ) { // If word already exists exit
|
|
|
|
mWordsView->UnselectAllCells();
|
|
|
|
mWordsView->SelectCell(cell);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mWordsView->InsertRows(1, mNumWords, theWord, theWord[0] + 1, Refresh_Yes);
|
|
|
|
mNumWords++;
|
|
|
|
cell.row = mNumWords;
|
|
|
|
mWordsView->UnselectAllCells();
|
|
|
|
mWordsView->SelectCell(cell);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::FinishCreateSelf
|
|
|
|
// Setup object references
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionary::FinishCreateSelf () {
|
|
|
|
|
|
|
|
mAddButton = dynamic_cast<LGAPushButton *>(FindPaneByID(AddButtonID));
|
|
|
|
mReplaceButton = dynamic_cast<LGAPushButton *>(FindPaneByID(ReplaceButtonID));
|
|
|
|
mRemoveButton = dynamic_cast<LGAPushButton *>(FindPaneByID(RemoveButtonID));
|
|
|
|
mHelpButton = dynamic_cast<LGAPushButton *>(FindPaneByID(HelpButtonID));
|
|
|
|
mWordNameField = dynamic_cast<CLargeEditFieldBroadcast *>(FindPaneByID(WordID));
|
|
|
|
mWordsView = dynamic_cast<CTextTable *>(FindPaneByID( WordsTableID ));
|
|
|
|
|
|
|
|
ThrowIfNil_(mAddButton);
|
|
|
|
ThrowIfNil_(mReplaceButton);
|
|
|
|
ThrowIfNil_(mRemoveButton);
|
|
|
|
ThrowIfNil_(mHelpButton);
|
|
|
|
ThrowIfNil_(mWordNameField);
|
|
|
|
ThrowIfNil_(mWordsView);
|
|
|
|
|
|
|
|
LGADialogBox::FinishCreateSelf();
|
|
|
|
|
|
|
|
PenState penState;
|
|
|
|
::GetPenState( &penState );
|
|
|
|
mWordsView->AddAttachment( new LColorEraseAttachment( &penState, NULL, NULL, true ) );
|
|
|
|
mAddButton->Disable(); // Add button should be originally disabled
|
|
|
|
mReplaceButton->Disable();
|
|
|
|
mRemoveButton->Disable();
|
|
|
|
|
|
|
|
mAddButton->AddListener( this );
|
|
|
|
mReplaceButton->AddListener( this );
|
|
|
|
mRemoveButton->AddListener( this );
|
|
|
|
mWordNameField->AddListener( this );
|
|
|
|
mWordsView->AddListener( this );
|
|
|
|
mHelpButton->AddListener( this );
|
|
|
|
}
|
|
|
|
|
|
|
|
// Constructor
|
|
|
|
|
|
|
|
CEditDictionary::CEditDictionary(LStream *inStream) : mNumWords(0),
|
|
|
|
mWordNameField(NULL), mISpellChecker(NULL), mAddButton(NULL), mWordsView(NULL),
|
|
|
|
mHelpButton(NULL), LGADialogBox (inStream) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::SetISPellChecker
|
|
|
|
// Sets personal dictionary and inserts into GUI
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
void CEditDictionary::SetISpellChecker(ISpellChecker *i) {
|
|
|
|
|
|
|
|
STableCell cell(0, 1);
|
1998-09-29 17:20:41 +00:00
|
|
|
Uint32 unusedNumber;
|
1998-03-28 02:44:41 +00:00
|
|
|
char word_buffer[max_word_length];
|
|
|
|
int curr_word_length;
|
|
|
|
|
|
|
|
mISpellChecker = i;
|
|
|
|
cell.row = 0;
|
|
|
|
|
|
|
|
if ((mISpellChecker->GetFirstPersonalDictionaryWord(word_buffer, max_word_length) >= 0) && mWordsView) {
|
|
|
|
mWordsView->FocusDraw();
|
|
|
|
do {
|
|
|
|
mNumWords++;
|
|
|
|
cell.row++;
|
|
|
|
curr_word_length = strlen(word_buffer);
|
|
|
|
CStr255 pascalstring( word_buffer );
|
|
|
|
mWordsView->InsertRows(1, cell.row-1, NULL ,0, Refresh_Yes);
|
|
|
|
mWordsView->SetCellData(cell, pascalstring, curr_word_length + 1);
|
|
|
|
// Insert the words into dialog box here!
|
|
|
|
} while (mISpellChecker->GetNextPersonalDictionaryWord(word_buffer, max_word_length) >= 0);
|
|
|
|
}
|
|
|
|
|
|
|
|
mWordsView->GetTableSize(mNumWords, unusedNumber);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionary::GetISPellChecker
|
|
|
|
// Get the Personal Dictionary
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
ISpellChecker *CEditDictionary::GetISpellChecker() {
|
|
|
|
|
|
|
|
return mISpellChecker;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionaryTable::BeTarget()
|
|
|
|
// Broadcast messages when we become target so we can setup buttons
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionaryTable::BeTarget() {
|
|
|
|
|
|
|
|
CTextTable::BeTarget();
|
|
|
|
BroadcastMessage(CEditDictionary::WordsTableID, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// CEditDictionaryTable::DontBeTarget()
|
|
|
|
// Broadcast messages when we lose target so we can setup buttons
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionaryTable::DontBeTarget() {
|
|
|
|
|
|
|
|
CTextTable::DontBeTarget();
|
|
|
|
BroadcastMessage(CEditDictionary::msg_LeaveDictionaryTable, NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
// HiliteSelection
|
|
|
|
// Setup back/front colors. Otherwise we sometimes get the de-highlighting
|
|
|
|
// wrong when switching selection
|
|
|
|
//-------------------------------------------------------------------------------------
|
|
|
|
void CEditDictionaryTable::HiliteSelection( Boolean inActively, Boolean inHilite )
|
|
|
|
{
|
|
|
|
if (inActively) {
|
|
|
|
StColorPenState::Normalize();
|
|
|
|
}
|
|
|
|
LTableView::HiliteSelection( inActively, inHilite );
|
|
|
|
}
|