http://git-wip-us.apache.org/repos/asf/flex-utilities/blob/4e4f9830/Squiggly/main/SpellingUITLF/src/com/adobe/linguistics/spelling/SquigglyCustomContainerController.as
----------------------------------------------------------------------
diff --git 
a/Squiggly/main/SpellingUITLF/src/com/adobe/linguistics/spelling/SquigglyCustomContainerController.as
 
b/Squiggly/main/SpellingUITLF/src/com/adobe/linguistics/spelling/SquigglyCustomContainerController.as
new file mode 100644
index 0000000..9ea0f9a
--- /dev/null
+++ 
b/Squiggly/main/SpellingUITLF/src/com/adobe/linguistics/spelling/SquigglyCustomContainerController.as
@@ -0,0 +1,258 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package com.adobe.linguistics.spelling
+{
+       import com.adobe.linguistics.spelling.SpellUIForTLF;
+       import com.adobe.linguistics.spelling.framework.SpellingService;
+       import com.adobe.linguistics.spelling.ui.IHighlighter;
+       import com.adobe.linguistics.spelling.ui.IWordProcessor;
+       import com.adobe.linguistics.spelling.ui.TLFHighlighter;
+       import com.adobe.linguistics.spelling.ui.TLFWordProcessor;
+       import com.adobe.linguistics.utils.TextTokenizer;
+       import com.adobe.linguistics.utils.Token;
+       
+       import flash.display.Sprite;
+       import flash.events.ContextMenuEvent;
+       import flash.events.Event;
+       import flash.events.EventDispatcher;
+       import flash.geom.Point;
+       import flash.geom.Rectangle;
+       import flash.ui.ContextMenu;
+       import flash.ui.ContextMenuItem;
+       
+       import flashx.textLayout.compose.StandardFlowComposer;
+       import flashx.textLayout.compose.TextFlowLine;
+       import flashx.textLayout.container.ContainerController;
+       import flashx.textLayout.conversion.TextConverter;
+       import flashx.textLayout.edit.SelectionManager;
+       import flashx.textLayout.elements.FlowLeafElement;
+       import flashx.textLayout.elements.ParagraphElement;
+       import flashx.textLayout.elements.TextFlow;
+       import flashx.textLayout.events.CompositionCompleteEvent;
+       import flashx.textLayout.events.StatusChangeEvent;
+       import flashx.textLayout.tlf_internal;
+       
+       /** Custom container controller for populating context menu and 
hanlding menu item selection  */
+       internal class SquigglyCustomContainerController extends 
ContainerController
+       {
+               private var disableMenuItem:ContextMenuItem = new 
ContextMenuItem("Disable spell checking",true);
+               private var enableMenuItem:ContextMenuItem = new 
ContextMenuItem("Enable spell checking");              
+               
+               private var controlMenuItemList:Array = new Array();
+               private var suggestionMenuItemList:Array = new Array();
+               private var _spellingEnabled:Boolean;
+               private var _contextMenu:ContextMenu;
+               private var mTextHighlighter:IHighlighter;
+               private var mWordProcessor:IWordProcessor;
+               private var mSpellEngine:SpellingService;
+               private var mTextFlow:TextFlow;
+               private var _ignoreWordFunctionProcessor:Function;
+               private var _misspelledToken:Token;
+               private var _misspelled:String;
+               
+               public function 
SquigglyCustomContainerController(container:Sprite,textHighlighter:IHighlighter,
 wordProcessor:IWordProcessor, engine:SpellingService,
+                                                                               
                                  func:Function, 
compositionWidth:Number=100,compositionHeight:Number=100)
+               {
+                       super (container, compositionWidth, compositionHeight);
+                       mTextHighlighter = textHighlighter;
+                       mWordProcessor = wordProcessor;
+                       mSpellEngine = engine;
+                       _ignoreWordFunctionProcessor = func;
+                       
+                       spellingEnabled = true;
+               }
+               
+               /** Overridden to add custom items to the context menu */
+               override protected function createContextMenu():ContextMenu
+               {
+                       // Get the default context menu used by TLF for 
editable flows
+                       _contextMenu = super.container.contextMenu;
+                       if (_contextMenu == null)
+                               _contextMenu = super.createContextMenu();
+                               
+                       
+                       
enableMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
handleEnableSpellCheck);
+                       
disableMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
handleDisableSpellCheck);
+                       controlMenuItemList.push(enableMenuItem);
+                       controlMenuItemList.push(disableMenuItem);
+                       
+                       _contextMenu.customItems.push(disableMenuItem);
+                       _contextMenu.customItems.push(enableMenuItem);
+                       
+                       // Listen for menu selection
+                       
_contextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, 
updateCustomMenuItems);
+                       
+                       return _contextMenu;
+               }
+               
+               /** Update the state of the custom menu items before the 
context menu is displayed */
+               private function 
updateCustomMenuItems(event:ContextMenuEvent):void 
+               {
+                       /* Clear the context menu */
+                       //spellingEnabled= mTextHighlighter.spellingEnabled;
+                       //SpellUI.doSpelling1();
+                       var removedNum:int = 0;
+                       var count:uint = _contextMenu.customItems.length;
+                       for (var j:uint=count; j>0; j--) {
+                               if ( isWordItem(_contextMenu.customItems[j-1]) 
) {
+                                       _contextMenu.customItems.splice(j-1,1);
+                                       removedNum++
+                               }
+                       }
+                       if ( removedNum != suggestionMenuItemList.length ) {
+                               trace("internal error");
+                       }
+                       
+                       
+                       suggestionMenuItemList = new Array();
+                       
+                       // localized entries
+                       var entries:Object = 
SpellUIForTLF.getSpellingMenuEntries();
+                       disableMenuItem.caption = entries.disable;
+                       enableMenuItem.caption = entries.enable;                
                
+                       
+                       if (spellingEnabled == true) {
+                               (mWordProcessor as 
TLFWordProcessor).textFlowContainerController = this;
+                               
+                               //trace("stageX " +  
super.container.stage.mouseX);
+                               //trace("stageY " +  
super.container.stage.mouseY);
+                               //trace("mouseX " +  super.container.mouseX);
+                               //trace("mouseY " +  super.container.mouseY);
+                               _misspelledToken = 
mWordProcessor.getWordAtPoint(this.container.mouseX, this.container.mouseY);
+                               if (_misspelledToken==null) return;
+                               var currentLeaf:FlowLeafElement = 
this.textFlow.findLeaf(_misspelledToken.first);
+                               var currentParagraph:ParagraphElement = 
currentLeaf ? currentLeaf.getParagraph() : null;
+                               _misspelled =   
currentParagraph.getText().substring(_misspelledToken.first - 
currentParagraph.getAbsoluteStart(), 
+                                                                               
                                                                
_misspelledToken.last - currentParagraph.getAbsoluteStart());
+                               if ((_misspelled==null) || (_misspelled == "")) 
return;
+                               
+                               if (mSpellEngine.checkWord(_misspelled)==true) 
return;                          
+                               
+                               var suseAddToItem:ContextMenuItem = new 
ContextMenuItem(entries.add);
+                               
suseAddToItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
handleAddToItemSelect);
+                               suggestionMenuItemList.push(suseAddToItem);
+                               
_contextMenu.customItems.splice(0,0,suseAddToItem);     
+                               //var result:Array = 
mWordProcessor.getSuggestionsAtPoint();
+                               var resultVector:Vector.<String> = 
mSpellEngine.getSuggestions(_misspelled);
+                               var result:Array = new Array();
+                               if (resultVector) {
+                                       for each (var w:String in resultVector)
+                                       result.push(w);
+                               }
+                               if (result!=null) {
+                                       for (var i:int=result.length-1;i>=0;i-- 
) {
+                                               var 
suseMenuItem:ContextMenuItem = new ContextMenuItem(result[i]);
+                                               
suseMenuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, 
handleSuseItemSelect);
+                                               
suggestionMenuItemList.push(suseMenuItem);
+                                               
//_contextMenu.customItems.push(suseMenuItem);
+                                               
_contextMenu.customItems.splice(0,0,suseMenuItem);
+                                       }
+                               }
+                       }
+               }
+               
+               private function 
handleAddToItemSelect(event:ContextMenuEvent):void
+               {
+                       if ( _ignoreWordFunctionProcessor == null ) return;
+                       
+                       /*
+                       var menuEntry:String = (event.currentTarget as 
ContextMenuItem).caption;
+                       var start:uint = 5;
+                       var end:uint = menuEntry.length - 15;
+                       var word:String = menuEntry.substring(start, end);
+                       */
+                       _ignoreWordFunctionProcessor(_misspelled);
+                       
SpellUIForTLF.UITable[SpellUIForTLF.parentComp[super.textFlow]].doSpellingJob();
+               }
+               
+               private function 
handleSuseItemSelect(event:ContextMenuEvent):void
+               {
+                       mWordProcessor.replaceText(_misspelledToken, 
(event.currentTarget as ContextMenuItem).caption );
+                       
SpellUIForTLF.UITable[SpellUIForTLF.parentComp[super.textFlow]].doSpellingJob();
+               }
+                       
+               private function set spellingEnabled(value:Boolean) :void {
+                       _spellingEnabled = value;
+                       disableMenuItem.visible=spellingEnabled;
+                       enableMenuItem.visible=!spellingEnabled;
+               }
+               private function get spellingEnabled():Boolean {
+                       return this._spellingEnabled;
+               }
+               
+               private function isWordItem(item:ContextMenuItem):Boolean {
+                       
+                       for ( var i:int=0; i<suggestionMenuItemList.length; ++i 
) {
+                               if ( suggestionMenuItemList[i] == item ) return 
true;
+                       }
+                       return false;
+               }
+               
+               private function isControlItem(item:ContextMenuItem):Boolean {
+                       for (var i:int=0; i<controlMenuItemList.length; ++i) {
+                               if ( controlMenuItemList[i] == item) return 
true;
+                       }
+                       return false;
+               }
+               
+               private function 
handleEnableSpellCheck(event:ContextMenuEvent):void
+               {
+                       spellingEnabled= true;
+                       //mTextHighlighter.spellingEnabled= spellingEnabled;
+                       //SpellUI.doSpellingJob();
+                       //dispatchEvent(new Event(Event.RENDER));
+                       
+                       
SpellUIForTLF.UITable[SpellUIForTLF.parentComp[this.textFlow]].spellingEnabled 
= spellingEnabled;
+                       
SpellUIForTLF.UITable[SpellUIForTLF.parentComp[this.textFlow]].doSpellingJob();
+                       //spellCheckRange(getValidFirstWordIndex(), 
getValidLastWordIndex());
+               }
+               private function 
handleDisableSpellCheck(event:ContextMenuEvent):void
+               {
+                       spellingEnabled= false;
+                       
SpellUIForTLF.UITable[SpellUIForTLF.parentComp[this.textFlow]].spellingEnabled 
= spellingEnabled;
+                       mTextHighlighter.clearSquiggles();
+               }
+               
+               public function cleanUpContextMenu():void
+               {
+                       mTextHighlighter=null;
+                       mWordProcessor=null;
+                       spellingEnabled = false;
+                       _ignoreWordFunctionProcessor=null;
+                       
+                       
_contextMenu.removeEventListener(ContextMenuEvent.MENU_SELECT, 
updateCustomMenuItems);
+                       
+                       var removedNum:int = 0;
+                       var count:uint = _contextMenu.customItems.length;
+                       for (var j:uint=count; j>0; j--) {
+                               if ( isWordItem(_contextMenu.customItems[j-1]) 
|| isControlItem(_contextMenu.customItems[j-1]) ) {
+                                       _contextMenu.customItems.splice(j-1,1);
+                                       removedNum++
+                               }
+                       }
+                       if ( removedNum != suggestionMenuItemList.length + 
controlMenuItemList.length ) {
+                               trace("internal error");
+                       }
+                       
+                       suggestionMenuItemList = null;
+                       controlMenuItemList = null;
+               }
+               
+       }
+}
\ No newline at end of file

Reply via email to