Ejemplo n.º 1
0
        private void wrapArrayOrObjectItems(WrapInfo wi, List<WrapItem> wrapItems, WrapItem info, bool wrapFirstItem, bool wrapItemsAlignStart, bool isArray) 
        {
            wrapItems.Clear();
        
            //we're taking over wrapping, so now we need to figure out where all the items are going to
            //go
    //      wrappingFirstParm=mWrapFirstObjectItem;
            //put in entry for first item to make things easier for alignment code and if the
            //first item needs to be wrapped.
            WrapItem firstItem=new WrapItem(null, info.getDepth(), info.getFirstParmPos(), info.getBreakType(), true, info.getIndent());
            firstItem.setNextItemPos(info.getFirstParmPos());
            wrapItems.Add(firstItem);
            int alignmentOffset=updateEarlyWrapPoint(firstItem, isArray);
        
            int itemIndent=info.getIndent();
            if ((!wrapFirstItem || isFirstItemOnLine(firstItem.getStartPos())) && info.getFirstParmPos()>0)
            {
                itemIndent=getColumnForPosition(firstItem.getStartPos());
                wrapFirstItem=false;
            }

    //      itemIndent-=alignmentOffset; //to adjust for the open brace/bracket and spaces
    //      if (!wrapFirstItem)
    //          itemIndent=getColumnForPosition(firstItem.getStartPos());
        
            findWrapItemsAndAdjustChildIndent(wi, info, wrapItems);
        
            //find the first text pos for each item
            foreach (WrapItem item in wrapItems) 
            {
                if (item.getNextItemPos()<0)
                {
                    //update item pos by finding the next non-whitespace char after the comma pos
                    int location=item.getStartPos()+1;
                    for (;location<mOutputBuffer.Length;location++)
                    {
                        if (!AntlrUtilities.isASWhitespace(mOutputBuffer[location]))
                            break;
                    }
                    item.setNextItemPos(location);
                }
            }                       
        
    //      if (mWrapObjectItemsPerLine>0) //predetermined how many to do per line (usually one)
    //      {
    //          //remove items that aren't used, and mark them 'used' so that they won't break again
    //          
    //          int[] maxItemWidths=new int[mWrapObjectItemsPerLine];
    //          findMaxItemWidths(wrapItems, maxItemWidths);
    //          setUsedItems(wrapItems, itemIndent, itemsPerLine);
    //          
    //          //determine (and add) extra spaces before removing items from list
    //          if (mWrapObjectItemsAlignStart)
    //          {
    //              addInternalSpaces(wi, wrapItems, maxItemWidths);                    
    //          }
    //          
    //          //remove items that won't receive breaks
    //          removeUsedItems(wrapItems);
    //      }
    //      else
            {
                if (wrapItemsAlignStart)
                {
                    if (wrapFirstItem && !isFirstItemOnLine(firstItem.getStartPos()))
                    {
                    }
                    else
                    {
                        firstItem.setBreakUsed(true);
                    }
                

                    //start with max items, then work down as I find a line that's tool long 
                    //because of the aligned columns.
                    int itemsPerLine=wrapItems.Count;
                
                    //decrement itemsPerLine as we try to find a fit
                    int[] maxItemWidths=new int[itemsPerLine];
                    while (itemsPerLine>1)
                    {
                        //find the max widths of items based on the given items per line
                        maxItemWidths=new int[itemsPerLine];
                        findMaxItemWidths(wrapItems, maxItemWidths);
                    
                        //now, check the max widths and see if this number of items will work for all lines
                        int column=itemIndent;
                        for (int i=0;i<itemsPerLine;i++)
                        {
                            column+=maxItemWidths[i];
                        }
                        if (column<=mMaxLineLength)
                            break;
                    
                        itemsPerLine--;
                    }
                
                    //mark the items as 'used' if we're not going to have to break them further
                    setUsedItems(wrapItems, itemIndent, itemsPerLine, wrapFirstItem, wrapFirstItem ? alignmentOffset : 0);
                
                    //I've picked a correct number of items per line--now, increment the positions where necessary.
                    addInternalSpaces(wi, wrapItems, maxItemWidths);
                
                    //remove items that won't receive breaks
                    removeUsedItems(wrapItems);
                }
                else //just wrapping items to line length, no alignment
                {
                    //determine each wrap item and remove the others
                    int originalIndent=info.getIndent();
                    int currentIndent=itemIndent;
                    int currentItemStartPos=firstItem.getStartPos();
                    if (wrapFirstItem && firstItem.getAlternateFirstItemWrapPoint()>=0)
                        currentItemStartPos=firstItem.getAlternateFirstItemWrapPoint();
                    int itemsSinceLastWrap=0;
                    for (int i=0;i<wrapItems.Count;i++)
                    {
                        WrapItem item=wrapItems[i];
                        int nextStartPos = mOutputBuffer.ToString().IndexOf('\n', item.getStartPos());
                        if (nextStartPos<0)
                            nextStartPos=mOutputBuffer.Length;
                        if (i+1<wrapItems.Count)
                        {
                            WrapItem nextItem = wrapItems[i+1];
                            nextStartPos=nextItem.getStartPos();
                        }
                    
                        int testLength=nextStartPos-currentItemStartPos+currentIndent+1;
    //                  String testString=mOutputBuffer.Substring(currentItemStartPos, nextStartPos);
    //                  int testLength=currentIndent+getColumnLength(0, testString, 0, testString.Length);  
                        if (testLength>mMaxLineLength && itemsSinceLastWrap>0 && !isFirstItemOnLine(item.getStartPos()))
                        {
                            currentItemStartPos=item.getNextItemPos();
                            if (!info.isIndentToFirstParm()) //switch indent if we are not indenting to first item
                            {
                                currentIndent=originalIndent+alignmentOffset;
                            }
                            itemsSinceLastWrap=1;
                        }
                        else
                        {
                            if (i>0 || !wrapFirstItem || isFirstItemOnLine(item.getStartPos()))
                                item.setBreakUsed(true); //don't need to break here
                        
                            if (item.isBreakUsed() || i==0) //1st item is special because it doesn't matter if it's wrapped or not, it's still an item on the line
                                itemsSinceLastWrap++;
                            else
                                itemsSinceLastWrap=1; //to account for case where already on a line by itself
                        }
                    }
                
                    for (int i=1;i<wrapItems.Count;i++) //start at 1 to skip the first item
                    {
                        WrapItem item = wrapItems[i];
                        item.setIndent(originalIndent+alignmentOffset);
                    }
                
                    //remove items that won't receive breaks
                    removeUsedItems(wrapItems);
                }
            }
        }