Exemple #1
0
        void CompletionList_OnInsert(ScintillaControl sender, int position, string text, char trigger, ICompletionListItem item)
        {
            if (trigger == '(' || trigger == '.') return;
            if (!(item is MemberItem)) return; // Generate Event
              //      if (item is EventItem) return;
             currentData = (DataEvent)currentNotifyEvent;
             Hashtable table = currentData.Data as Hashtable;
             if (table==null) return;

            ASResult res = (table)["context"] as ASResult;

            if (res == null) return;

            MemberModel member = res.Member;
            int posAdd = 0;

                    if (member != null)
                    {
                        if ((member.Flags & FlagType.Function) == 0) { return; }

                            int pos = sender.CurrentPos;
                            int insertPos = pos;
                            if (((member.Flags & FlagType.Constructor) > 0))
                            {

                                if (!thereIsNewWord(sender))
                                {
                                    sender.GotoPos(pos);
                                    return;
                                }
                            }

                          //  sender.ReplaceSel
                                bool hasParameters = false;

                                char lastChar=' ';
                                posAdd = SearchNextNewLineWithoutChar(sender, position, text, ref lastChar);

                                if (lastChar == '(')
                                {
                                    return;
                                }

                            // Search if is a parameter of a function
                                if (lastChar == ',' || lastChar == ')')
                                {
                                    if (IsFunctionParameter(sender, position - 1))
                                    {
                                        return;
                                    };
                                }

                                sender.BeginUndoAction();

                                if (posAdd > 0)
                                {
                                    sender.InsertText(pos, "();");
                                    posAdd = 1;

                                }
                                else
                                    sender.InsertText(pos, "()");

                                pos++;

                                if (!(trigger == '[' || trigger == '"'))
                                {
                                    if (member.Parameters != null)
                                    {
                                        if (member.Parameters.Count == 0)
                                        {
                                            pos += 1 + posAdd;

                                        }
                                        else
                                        {
                                            hasParameters = true;
                                        }

                                    }
                                    else
                                    {
                                        pos += 1 + posAdd;
                                    }

                                }

                                sender.GotoPos(pos);

                                if (hasParameters)
                                {
                                    if (abbreviations != null &&  member.Parameters[0].Value == null && member.Parameters[0].Name != "...rest")
                                    {

                                       // string str = res.Member.ToString();
                                        TextParameters tp = new TextParameters(res.Member);

                                        if (member.Name.EndsWith("EventListener"))
                                        {
                                            if (text.EndsWith("Event"))
                                            {
                                                sender.GotoPos(insertPos+2);
                                                sender.DeleteBack();
                                                sender.DeleteBack();
                                                sender.EndUndoAction();
                                                return;
                                            }
                                            abbreviations.CreateParameters(member.Parameters, true,tp);

                                        }
                                        else
                                            abbreviations.CreateParameters(member.Parameters, false,tp);

                                        sender.EndUndoAction();
                                        return;
                                    }

                                    ASComplete.HandleFunctionCompletion(sender, true);
                                }

                                sender.EndUndoAction();

                    }
                    else if (res.Type != null)
                    {

                        int pos2 = sender.CurrentPos;

                        bool hasParameters = false;
                        MemberModel mlConstructor = null;

                        if (!thereIsNewWord(sender)) { sender.GotoPos(pos2); return; }

                            char lastChar=' ';
                            posAdd = SearchNextNewLineWithoutChar(sender, pos2, "",ref lastChar);

                            if (lastChar == '(') { sender.GotoPos(pos2); return; }

                            if (res.Type.Members.Count > 0)
                            {

                                foreach (MemberModel ml in res.Type.Members)
                                {
                                    if ((ml.Flags & FlagType.Constructor)>0)
                                    {
                                        if (ml.Parameters!=null && ml.Parameters.Count > 0)
                                        {
                                            mlConstructor = ml;
                                            hasParameters = true;
                                        }
                                        break;
                                    }
                                }

                            }

                            if(posAdd>0)
                                sender.InsertText(pos2, "();");
                            else
                            sender.InsertText(pos2, "()");

                            if (trigger == '[' || trigger == '"' || hasParameters)
                              pos2++;
                            else
                            pos2 += 2 + posAdd;

                        sender.GotoPos(pos2);
                        if (hasParameters)
                        {
                            sender.BeginUndoAction();
                            if (abbreviations != null && mlConstructor.Parameters[0].Value == null && mlConstructor.Parameters[0].Name != "...rest")
                            {
                                TextParameters tp = new TextParameters(mlConstructor);

                               abbreviations.CreateParameters(mlConstructor.Parameters, false, tp);
                            }
                            else
                                ASComplete.HandleFunctionCompletion(sender, true);
                            sender.EndUndoAction();
                        }

                    }
        }
 void IDisposable.Dispose()
 {
     textParameters = null;
     textParameter = null;
     NextWord = null;
 }
        /// <summary>
        /// Place the cursor a the end of the next word
        /// </summary>
        public void MoveNextWord()
        {
            if (isList>-1)
            {

                CompletionList.OnInsert -= new InsertedTextHandler(CompletionList_OnInsert);
                if (CompletionList.Active)
                    CompletionList.Hide();
                isList = -1;
            }

            if (UITools.CallTip.CallTipActive)
                UITools.CallTip.Hide();

            curIndWord++;

            if (curIndWord >= Words.Count ) curIndWord = 0;

             WordRegionBase wr =  Words[curIndWord];

               if (wr.type == WordRegion.kind.place || wr.type== WordRegionBase.kind.VarLink)
               {
                   sciMonitor.SetSel(wr.startWord, wr.endWord);

                   return;
               }
               else if (wr.type == WordRegionBase.kind.Parameter)
               {
                   sciMonitor.SetSel(wr.startWord, wr.endWord);

                   ((WordRegionParameter)wr).ShowTips(sciMonitor);

               }
               else if (wr.type == WordRegionBase.kind.customList)
               {
                   sciMonitor.SetSel(wr.startWord, wr.endWord);
                   WordCustomList wc = (WordCustomList)wr;
                   List<PluginCore.ICompletionListItem> lcomp = new List<PluginCore.ICompletionListItem>();
                   List<string> ls = null;
                   if (_dictCustomList.ContainsKey(wc.indList))
                   {

                       ls = _dictCustomList[wc.indList];

                       if (ls.Count == 0)
                       {
                           UITools.CallTip.CallTipShow(ASContext.CurSciControl,ASContext.CurSciControl.CurrentPos, "This List is empty!!");
                           return;
                       }
                       else
                       {
                           foreach (string item in ls)
                           {
                               lcomp.Add(new CompletionListItem(item, ManagerResources.EmptyBitmap));
                           }
                       }
                   }
                   else
                   {
                       UITools.CallTip.CallTipShow(ASContext.CurSciControl, ASContext.CurSciControl.CurrentPos, "No list at current index!!");
                       return;
                   }

                   CompletionList.OnInsert += new InsertedTextHandler(CompletionList_OnInsert);
                   CompletionList.Show(lcomp, false);

                   isList = curIndWord;

               }
               else if (wr.type == WordRegion.kind.showCompType || wr.type == WordRegionBase.kind.VarLinkAndComp)
               {
                   sciMonitor.SetSel(wr.startWord, wr.endWord);

                   if (ASContext.HasContext && ASContext.Context.IsFileValid)
                   {
                       int pos = wr.startWord - 1;
                       char c = (char)sciMonitor.CharAt(pos);

                       if (c == ' ')
                           c = '.';

                    //   CompletionList.OnChar(sciMonitor, (int)c);
                      UITools.Manager.SendChar(sciMonitor, c);
                      if (!CompletionList.Active) return;

                       CompletionList.OnInsert += new InsertedTextHandler(CompletionList_OnInsert);
                       isList = curIndWord;

                   }

               }
               else if (wr.type == WordRegion.kind.temporary )
               {
                   //if (wr.type == WordRegionBase.kind.Import)
                   //{

                   //    MoveNextWord();
                   //    // eliminate import word
                   //    Words.Remove(declarationWord);
                   //    firstWord = declarationWord.NextWord;
                   //    declarationWord.NextWord = null;
                   //    declarationWord = null;

                   //    return;
                   //}

                   sciMonitor.GotoPos(wr.endWord - 1);

               }
               else if (wr.type == WordRegion.kind.cursor)
               {
                   sciMonitor.GotoPos(wr.endWord);
                   //isCursorWord = true;
               }
               else if (wr.type == WordRegionBase.kind.createParameters)
               {
                   sciMonitor.GotoPos(wr.startWord);
                   ASCompletion.Completion.ASResult result = null;

                   // sciMonitor.GotoPos(wr.startWord);

                  int pos = sciMonitor.CurrentPos;
                  int pos2 = pos;

                  char c =(char) sciMonitor.CharAt(--pos);

                   while(char.IsWhiteSpace(c))
                   {
                       c = (char)sciMonitor.CharAt(--pos);
                   }

                   if (c != '(') return;

                   char c2 = (char)sciMonitor.CharAt(pos2);

                   while (char.IsWhiteSpace(c2))
                   {
                       c2 = (char)sciMonitor.CharAt(++pos2);
                   }

                   if (c2 != ')') return;

                  if(PathExplorer.IsWorking)
                  {
                      Abbreviations.WaitFinishPathExplorer();
                  }

                   c = (char)sciMonitor.CharAt(--pos);

                  while (char.IsWhiteSpace(c))
                  {
                      c = (char)sciMonitor.CharAt(--pos);
                  }
                  pos++;

                   //sciMonitor.WordLeft();
                   //string str = sciMonitor.GetWordFromPosition(pos);
                   //string str1 = sciMonitor.GetLine(sciMonitor.LineFromPosition(wr.startWord));
                     result = ASCompletion.Completion.ASComplete.GetExpressionType(sciMonitor, pos);

                   if (result.Member != null)
                   {

                       if ( result.Member.Parameters!=null &&  result.Member.Parameters.Count > 0)
                       {
                           if (result.Member.Parameters[0].Value == null &&  result.Member.Parameters[0].Type!=null && result.Member.Parameters[0].Name != "...rest")
                           {

                               TextParameters tp = new TextParameters(result.Member);

                               CreateParameters(result.Member.Parameters, tp);
                               return;
                           }
                           else
                           {
                               sciMonitor.GotoPos(wr.endWord);
                               ASCompletion.Completion.ASComplete.HandleFunctionCompletion(sciMonitor, true);
                           }
                       }
                       else
                       {
                           sciMonitor.GotoPos(wr.endWord);
                       }
                   }
                   else if (result.Type != null)
                   {
                       if (result.Type.Members.Count > 0)
                       {

                           foreach (MemberModel ml in result.Type.Members)
                           {
                               if ((ml.Flags & FlagType.Constructor) > 0)
                               {
                                   if (ml.Parameters != null && ml.Parameters.Count > 0)
                                   {
                                       if (ml.Parameters[0].Value == null && ml.Parameters[0].Name != "...rest")
                                       {
                                           TextParameters tp = new TextParameters(ml);

                                           CreateParameters(ml.Parameters, tp);

                                       }
                                       else
                                       {
                                           sciMonitor.GotoPos(wr.endWord);
                                           ASCompletion.Completion.ASComplete.HandleFunctionCompletion(sciMonitor, true);
                                       }

                                   }

                                   break;
                               }
                           }
                       }
                       else
                       {
                           sciMonitor.GotoPos(wr.endWord);
                       }

                   }
                   else
                   {
                       sciMonitor.GotoPos(wr.endWord);
                   }

               }
               else if (wr.type == WordRegion.kind.browser)
               {
                   sciMonitor.SetSel(wr.startWord, wr.endWord);
                   System.Windows.Forms.OpenFileDialog of = new System.Windows.Forms.OpenFileDialog();

                   //  isOpenDialog = true;
                   of.ShowDialog();
                   //isOpenDialog = false;
                   if (of.FileName.Length!=0)
                   {

                       int ind = of.FileName.IndexOf(ASContext.Context.CurrentModel.BasePath);

                       if (ind == -1)
                       {
                           // is extern to project
                           sciMonitor.ReplaceSel("\"" + of.FileName + "\"");
                       }
                       else
                       {

                           string relPath = ProjectManager.Projects.ProjectPaths.GetRelativePath(
                               System.IO.Path.GetDirectoryName(ASContext.Context.CurrentFile), of.FileName).Replace('\\', '/');

                           sciMonitor.ReplaceSel("\"" + relPath + "\"");
                       }

                       if (curIndWord != Words.Count - 1)
                           MoveNextWord();
                   }

               }
        }
        public void CreateParameters(List<ASCompletion.Model.MemberModel> parameters, TextParameters textParameters)
        {
            WordRegionBase previous = null;
            WordRegionBase nextWord = null;
            StringBuilder sb = new StringBuilder(10);
            int actpos = ASContext.CurSciControl.CurrentPos;
            int varpos = actpos;
            int index =0;
            WordRegionBase wrCurrent = null;
            if (!isMonitoring)
            {
                Words = new List<WordRegionBase>();
                curIndWord = index;

            }
            else
            {
               // if (curIndWord == Words.Count) curIndWord--;
                if (highlightWord != null)
                    highlightWord.Stop();

                 wrCurrent = firstWord;
                int position = sciMonitor.CurrentPos;

                TestInRegion(position);

                // La parola nella quale viene inserito/rimosso il carattere
                while (wrCurrent != null)
                {

                    if (position <= wrCurrent.endWord)
                    {
                        if ((wrCurrent.startWord <= position))
                        {

                            break;
                        }

                    }

                    previous = wrCurrent;
                    wrCurrent = wrCurrent.NextWord;

                }

                nextWord = wrCurrent.NextWord;

                sciMonitor.TextInserted -= new TextInsertedHandler(sciMonitor_TextInserted);
                index = curIndWord;
                Words.RemoveAt(curIndWord);

            }

            int startToolTip = textParameters.text.IndexOf("(") +1;
            textParameters.posParameters = actpos - startToolTip + 1;
              //  int indexToolTip = 0;

            WordRegionParameter wordParamater=null;
            WordRegionBase realPrevious = null;
            foreach (ASCompletion.Model.MemberModel mm in parameters)
            {
                if (mm.Value != null || mm.Name == "...rest") break;

                wordParamater = new WordRegionParameter();
                wordParamater.startWord = varpos;
                wordParamater.endWord = varpos + mm.Name.Length;
                wordParamater.type = WordRegionBase.kind.Parameter;
                wordParamater.textParameters = textParameters;
                wordParamater.startToolTip = startToolTip;
                //es              ( X              :    number)

                int typeLength = (mm.Type != null) ? mm.Type.Length : 0;

                wordParamater.endToolTip = startToolTip + mm.Name.Length + 1 + typeLength;
                // (, )
                startToolTip = wordParamater.endToolTip + 2;
                //indexToolTip++;

                //wr.indexToolTip = indexToolTip;
                sb.Append(mm.Name);
                sb.Append(", ");
                varpos = actpos + sb.Length;

                if (textParameters.comments != null)
                {

                    Match mParam = Regex.Match(textParameters.comments, "@param\\s+" + Regex.Escape(mm.Name) + "[ \t:]+(?<desc>[^\r\n]*)");

                    if (mParam.Success)
                    {
                        wordParamater.textParameter = "\n[B]" + mm.Name + ":[/B] " + mParam.Groups["desc"].Value.Trim();
                    }

                }

                Words.Insert(index, wordParamater);
                index++;
                if (previous == null)
                {
                    previous = wordParamater;
                }
                else
                {
                    previous.NextWord = wordParamater;
                    realPrevious = previous;
                    previous = wordParamater;
                }

            }

            sb.Remove(sb.Length - 2, 2);

            ASContext.CurSciControl.InsertText(actpos, sb.ToString());

            if (Words.Count > 1)
            {
                numCursors = 2;

                // last word
                if (nextWord == null)
                {
                    index--;
                   // WordRegionBase wb = Words[index];
                   // LastWordRegionParameter lw = (LastWordRegionParameter)wb.getLastWord();
                    WordRegionBase lw = wordParamater.getLastWord();
                   // Words[index - 1].NextWord = lw;
                    if (realPrevious != null)
                    {
                        realPrevious.NextWord = lw;
                    }

                    Words[index] = lw;
                    lastWord = lw;
                }
                else
                {
                    previous.NextWord = nextWord;
                }

                firstWord = Words[0];

                if (!isMonitoring)
                {
                    curIndWord = -1;
                    TryActivateMonitor();

                    if (highlightWord != null)
                        highlightWord.Start();

                    return;
                }
            }
            else
            {
                if(!isMonitoring)
                ASContext.CurSciControl.SetSel(previous.startWord, previous.endWord);
                numCursors = 1;
            }

            if (isMonitoring)
            {
                if (highlightWord != null)
                    highlightWord.Start();

                if (nextWord != null)
                {
                    nextWord.addCharactersNextWord(sb.Length);
                    wrCurrent.Disable();

                }
                sciMonitor.TextInserted += new TextInsertedHandler(sciMonitor_TextInserted);
                curIndWord--;
                MoveNextWord();

            }
        }
        public void CreateParameters(List<MemberModel> list, bool isEventListener, TextParameters textParameters)
        {
            ScintillaControl sci = ASContext.CurSciControl;

            if (!dictionaryCreateWords.TryGetValue(sci.Handle, out currentCreateWords))
            {

                currentCreateWords = CreateNewWords();
                currentSci = sci;

            }

            currentCreateWords.CreateParameters(list, textParameters);

            if (isEventListener)
            {
               // ScintillaControl sci = ASContext.CurSciControl;
                sci.ReplaceSel("");
                PluginCore.Controls.UITools.CallTip.Hide();
                ASComplete.HandleFunctionCompletion(sci, true);
                currentCreateWords.ActivateList();

            }
        }