private void ContextChanged() { ITabbedDocument doc = PluginBase.MainForm.CurrentDocument; bool isValid = false; if (doc.IsEditable) { ScintillaNet.ScintillaControl sci = ASContext.CurSciControl; if (currentDoc == doc.FileName && sci != null) { int line = sci.LineFromPosition(currentPos); ASContext.SetCurrentLine(line); } else { ASComplete.CurrentResolvedContext = null; // force update } isValid = ASContext.Context.IsFileValid; if (isValid) { ASComplete.ResolveContext(sci); } } else { ASComplete.ResolveContext(null); } bool enableItems = isValid && !doc.IsUntitled; pluginUI.OutlineTree.Enabled = ASContext.Context.CurrentModel != null; SetItemsEnabled(enableItems, ASContext.Context.CanBuild); }
/** * Handles the incoming events */ public void HandleEvent(Object sender, NotifyEvent e, HandlingPriority prority) { try { // ignore all events when leaving if (PluginBase.MainForm.ClosingEntirely) { return; } // current active document ITabbedDocument doc = PluginBase.MainForm.CurrentDocument; // application start if (!started && e.Type == EventType.UIStarted) { started = true; // associate context to initial document e = new NotifyEvent(EventType.SyntaxChange); } // editor ready? if (doc == null) { return; } ScintillaNet.ScintillaControl sci = doc.IsEditable ? doc.SciControl : null; // // Events always handled // bool isValid; switch (e.Type) { // caret position in editor case EventType.UIRefresh: if (!doc.IsEditable) { return; } try { int position = sci.CurrentPos; if (position != currentPos) { currentPos = position; if (currentDoc == doc.FileName) { int line = sci.LineFromPosition(currentPos); ASContext.SetCurrentLine(line); // UI SetItemsEnabled(ASContext.Context.IsFileValid); } } } catch {} // drag & drop sci Perform crash return; // key combinations case EventType.Keys: Keys key = (e as KeyEvent).Value; if (ModelsExplorer.HasFocus) { e.Handled = ModelsExplorer.Instance.OnShortcut(key); return; } if (!doc.IsEditable) { return; } e.Handled = ASComplete.OnShortcut(key, sci); return; // // File management // case EventType.FileSave: if (!doc.IsEditable) { return; } ASContext.Context.CheckModel(false); // toolbar isValid = ASContext.Context.IsFileValid; if (isValid && !PluginBase.MainForm.SavingMultiple) { if (ASContext.Context.Settings.CheckSyntaxOnSave) { CheckSyntax(null, null); } ASContext.Context.RemoveClassCompilerCache(); } return; case EventType.SyntaxDetect: // detect Actionscript language version if (!doc.IsEditable) { return; } if (doc.FileName.ToLower().EndsWith(".as")) { settingObject.LastASVersion = DetectActionscriptVersion(doc); (e as TextEvent).Value = settingObject.LastASVersion; e.Handled = true; } break; case EventType.ApplySettings: case EventType.SyntaxChange: case EventType.FileSwitch: if (!doc.IsEditable) { currentDoc = ""; SetItemsEnabled(false); ASContext.SetCurrentFile(null, true); return; } currentDoc = doc.FileName; currentPos = sci.CurrentPos; // check file bool ignoreFile = !doc.IsEditable; ASContext.SetCurrentFile(doc, ignoreFile); // UI bool enableItems = ASContext.Context.IsFileValid && !doc.IsUntitled; SetItemsEnabled(enableItems); pluginUI.OutlineTree.Enabled = ASContext.Context.CurrentModel != null; return; // some commands work all the time case EventType.Command: string command = (e as DataEvent).Action ?? ""; if (command.StartsWith("ASCompletion.")) { string cmdData = (e as DataEvent).Data as string; // add a custom classpath if (command == "ASCompletion.ClassPath") { //TraceManager.Add("CP = " + cmdData); if (cmdData != null) { int p = cmdData.IndexOf(';'); string lang = cmdData.Substring(0, p); ASContext.SetLanguageClassPath(lang, cmdData.Substring(p + 1)); } e.Handled = true; } // send a UserClasspath else if (command == "ASCompletion.GetUserClasspath") { Hashtable info = (e as DataEvent).Data as Hashtable; if (info != null && info.ContainsKey("language")) { IASContext context = ASContext.GetLanguageContext(info["language"] as string); if (context != null && context.Settings != null && context.Settings.UserClasspath != null) { info["cp"] = new List <string>(context.Settings.UserClasspath); } } e.Handled = true; } // update a UserClasspath else if (command == "ASCompletion.SetUserClasspath") { Hashtable info = (e as DataEvent).Data as Hashtable; if (info != null && info.ContainsKey("language") && info.ContainsKey("cp")) { IASContext context = ASContext.GetLanguageContext(info["language"] as string); List <string> cp = info["cp"] as List <string>; if (cp != null && context != null && context.Settings != null) { string[] pathes = new string[cp.Count]; cp.CopyTo(pathes); context.Settings.UserClasspath = pathes; } } e.Handled = true; } // send the language's compiler path else if (command == "ASCompletion.GetCompilerPath") { Hashtable info = (e as DataEvent).Data as Hashtable; if (info != null && info.ContainsKey("language")) { IASContext context = ASContext.GetLanguageContext(info["language"] as string); info["compiler"] = context != null?context.GetCompilerPath() : null; } e.Handled = true; } // show a language's settings else if (command == "ASCompletion.ShowSettings") { e.Handled = true; IASContext context = ASContext.GetLanguageContext(cmdData); if (context == null) { return; } string filter = ""; string name = ""; switch (cmdData.ToUpper()) { case "AS2": name = "AS2Context"; filter = "MTASC"; break; case "AS3": name = "AS3Context"; filter = "SDK"; break; case "HAXE": name = "HaXeContext"; filter = "HaXe"; break; default: name = cmdData.ToUpper() + "Context"; break; } PluginBase.MainForm.ShowSettingsDialog(name, filter); } // Open types explorer dialog else if (command == "ASCompletion.TypesExplorer") { TypesExplorer(null, null); } // call the Flash IDE else if (command == "ASCompletion.CallFlashIDE") { e.Handled = Commands.CallFlashIDE.Run(settingObject.PathToFlashIDE, cmdData); } // create Flash 8+ trust file else if (command == "ASCompletion.CreateTrustFile") { if (cmdData != null) { string[] args = cmdData.Split(';'); if (args.Length == 2) { e.Handled = Commands.CreateTrustFile.Run(args[0], args[1]); } } } else if (command == "ASCompletion.GetClassPath") { if (cmdData != null) { string[] args = cmdData.Split(';'); if (args.Length == 1) { FileModel fm = ASFileParser.ParseFile(args[0], ASContext.Context); if (fm != null) { if (fm.Classes != null && fm.Classes.Count > 0) { string classpath = fm.Classes[0].QualifiedName; if (classpath != null) { Clipboard.SetText(classpath); e.Handled = true; } } } } } } } else if (command == "ProjectManager.OpenVirtualFile") { string cmdData = (e as DataEvent).Data as string; if (Regex.IsMatch(cmdData, "\\.(swf|swc)::")) { string[] path = Regex.Split(cmdData, "::"); string fileName = path[0] + Path.DirectorySeparatorChar + path[1].Replace('.', Path.DirectorySeparatorChar).Replace("::", Path.DirectorySeparatorChar.ToString()) + "$.as"; FileModel found = ModelsExplorer.Instance.OpenFile(fileName); if (found != null) { e.Handled = true; } } } break; } // // Actionscript context specific // if (ASContext.Context.IsFileValid) { switch (e.Type) { case EventType.ProcessArgs: TextEvent te = (TextEvent)e; string cmd = te.Value; if (Regex.IsMatch(cmd, "\\$\\((Typ|Mbr|Itm)")) { // resolve current element Hashtable details = ASComplete.ResolveElement(sci, null); te.Value = ArgumentsProcessor.Process(cmd, details); } break; // menu commands case EventType.Command: string command = (e as DataEvent).Action ?? ""; if (command.StartsWith("ASCompletion.")) { string cmdData = (e as DataEvent).Data as string; // run MTASC if (command == "ASCompletion.CustomBuild") { if (cmdData != null) { ASContext.Context.RunCMD(cmdData); } else { ASContext.Context.RunCMD(""); } e.Handled = true; } // build the SWF using MTASC else if (command == "ASCompletion.QuickBuild") { ASContext.Context.BuildCMD(false); e.Handled = true; } // resolve element under cusor and open declaration else if (command == "ASCompletion.GotoDeclaration") { ASComplete.DeclarationLookup(sci); e.Handled = true; } // resolve element under cursor and send a CustomData event else if (command == "ASCompletion.ResolveElement") { ASComplete.ResolveElement(sci, cmdData); e.Handled = true; } else if (command == "ASCompletion.MakeIntrinsic") { ASContext.Context.MakeIntrinsic(cmdData); e.Handled = true; } // alternative to default shortcuts else if (command == "ASCompletion.CtrlSpace") { ASComplete.OnShortcut(Keys.Control | Keys.Space, ASContext.CurSciControl); e.Handled = true; } else if (command == "ASCompletion.CtrlShiftSpace") { ASComplete.OnShortcut(Keys.Control | Keys.Shift | Keys.Space, ASContext.CurSciControl); e.Handled = true; } else if (command == "ASCompletion.CtrlAltSpace") { ASComplete.OnShortcut(Keys.Control | Keys.Alt | Keys.Space, ASContext.CurSciControl); e.Handled = true; } } return; case EventType.ProcessEnd: string result = (e as TextEvent).Value; ASContext.Context.OnProcessEnd(result); break; } } } catch (Exception ex) { ErrorManager.ShowError(ex); } }