Пример #1
0
    public static void OnInsertedText(FGTextBuffer buffer, FGTextBuffer.CaretPos fromPos, FGTextBuffer.CaretPos toPos)
    {
        var guid = buffer.guid;
        var from = new TextPosition(fromPos.line, fromPos.characterIndex);
        var to   = new TextPosition(toPos.line, toPos.characterIndex);

        var recentLocations = Instance().recentLocations;

        for (var i = recentLocations.Count; i-- > 0;)
        {
            var entry = recentLocations[i];
            if (entry.assetGuid != guid)
            {
                continue;
            }

            var location = new TextPosition(entry.line, entry.index);
            if (from > location || insertingTextAfterCaret && from == location)
            {
                continue;
            }

            if (from.line == location.line)
            {
                entry.index += to.index - from.index;
            }
            entry.line += to.line - from.line;
        }
    }
Пример #2
0
    public static void AddRecentLocation(string assetGuid, FGTextBuffer.CaretPos caretPosition, bool insert)
    {
        if (_instance == null)
        {
            return;
        }

        var newLocation = new RecentLocation {
            assetGuid = assetGuid,
            line      = caretPosition.line,
            index     = caretPosition.characterIndex
        };

        if (insert && _instance.recentLocationsOffset != 0)
        {
            var current = _instance.recentLocations.Count - _instance.recentLocationsOffset;
            _instance.recentLocations.Insert(current, newLocation);
        }
        else
        {
            if (_instance.recentLocationsOffset != 0)
            {
                var current = _instance.recentLocations.Count - _instance.recentLocationsOffset;
                _instance.recentLocations.RemoveRange(current, _instance.recentLocationsOffset);
            }
            _instance.recentLocations.Add(newLocation);
            _instance.recentLocationsOffset = 0;
        }

        if (_instance.recentLocations.Count > 100 + _instance.recentLocationsOffset)
        {
            _instance.recentLocations.RemoveRange(0, _instance.recentLocations.Count - 100 - _instance.recentLocationsOffset);
        }
    }
Пример #3
0
    public static void OnRemovedText(FGTextBuffer buffer, FGTextBuffer.CaretPos fromPos, FGTextBuffer.CaretPos toPos)
    {
        var guid = buffer.guid;
        var from = new TextPosition(fromPos.line, fromPos.characterIndex);
        var to   = new TextPosition(toPos.line, toPos.characterIndex);

        var recentLocations = Instance().recentLocations;

        for (var i = recentLocations.Count; i-- > 0;)
        {
            var entry = recentLocations[i];
            if (entry.assetGuid != guid)
            {
                continue;
            }

            var location = new TextPosition(entry.line, entry.index);
            if (from >= location)
            {
                continue;
            }

            if (to >= location)
            {
                entry.line  = from.line;
                entry.index = from.index;
                continue;
            }

            if (to.line == location.line)
            {
                entry.index -= to.index - from.index;
            }
            entry.line -= to.line - from.line;
        }

        if (recentLocations.Count > 1)
        {
            var prevLocation = recentLocations[0];
            for (var i = 1; i < recentLocations.Count; ++i)
            {
                var entry = recentLocations[i];
                if (entry.assetGuid != prevLocation.assetGuid || entry.line != prevLocation.line || entry.index != prevLocation.index)
                {
                    prevLocation = entry;
                }
                else
                {
                    if (_instance.recentLocationsOffset >= recentLocations.Count - i)
                    {
                        --_instance.recentLocationsOffset;
                    }
                    recentLocations.RemoveAt(i);
                    --i;
                }
            }
        }
    }
Пример #4
0
 private void OnBufferModified(string guid, FGTextBuffer.CaretPos from, FGTextBuffer.CaretPos to)
 {
     for (var i = 0; i < results.Count; i++)
     {
         var result = results[i];
         if (result.description != null && guid == result.assetGuid)
         {
             Unsubscribe();
             Close();
             break;
         }
     }
 }
	private void ReplaceAll()
	{
		Unsubscribe();
		
		FGTextBuffer buffer = null;
		string guid = null;
		bool canEditAll = true;
		var canEditBuffers = new HashSet<FGTextBuffer>();
		
		for (var i = flatResults.Count; i --> 0; )
		{
			var result = flatResults[i];
			if (!result.selected)
				continue;
			
			if (result.assetGuid != guid)
			{
				guid = result.assetGuid;
				buffer = FGTextBufferManager.GetBuffer(guid);
				if (buffer.IsLoading)
					buffer.LoadImmediately();
				
				if (FGCodeWindow.CodeWindows.All(x => x.TargetAssetGuid != guid))
				{
					var wnd = FGCodeWindow.OpenAssetInTab(guid);
					if (wnd)
						wnd.OnFirstUpdate();
				}
				if (!buffer.TryEdit())
					canEditAll = false;
				else
					canEditBuffers.Add(buffer);
			}
		}
		
		if (!canEditAll)
		{
			if (!EditorUtility.DisplayDialog("Replace", "Some assets are locked and cannot be edited!", "Continue Anyway", "Cancel"))
			{
				Close();
				return;
			}
		}
		
		buffer = null;
		guid = null;
		var updatedLines = new HashSet<int>();
		for (var i = flatResults.Count; i --> 0; )
		{
			var result = flatResults[i];
			if (!result.selected)
				continue;
			
			if (result.assetGuid != guid)
			{
				if (buffer != null)
				{
					foreach (var line in updatedLines)
						buffer.UpdateHighlighting(line, line);
					buffer.EndEdit();
					FGTextBufferManager.AddBufferToGlobalUndo(buffer);
					updatedLines.Clear();
				}
				
				guid = result.assetGuid;
				buffer = FGTextBufferManager.GetBuffer(guid);
				
				if (buffer != null)
				{
					if (canEditBuffers.Contains(buffer))
						buffer.BeginEdit("*Replace All");
					else
						buffer = null;
				}
			}
			
			if (buffer != null)
			{
				var from = new FGTextBuffer.CaretPos { line = result.line, characterIndex = result.characterIndex };
				var to = new FGTextBuffer.CaretPos { line = result.line, characterIndex = result.characterIndex + result.length };
				var insertAt = buffer.DeleteText(from, to);
				if (replaceText != "")
					buffer.InsertText(insertAt, replaceText);
				
				updatedLines.Add(result.line);
			}
		}
		if (buffer != null)
		{
			foreach (var line in updatedLines)
				buffer.UpdateHighlighting(line, line);
			buffer.EndEdit();
			FGTextBufferManager.AddBufferToGlobalUndo(buffer);
		}
		
		FGTextBufferManager.RecordGlobalUndo();
		Close();
	}
Пример #6
0
        private void ReplaceAll()
        {
            Unsubscribe();

            FGTextBuffer buffer         = null;
            string       guid           = null;
            bool         canEditAll     = true;
            var          canEditBuffers = new HashSet <FGTextBuffer>();

            for (var i = flatResults.Count; i-- > 0;)
            {
                var result = flatResults[i];
                if (!result.selected)
                {
                    continue;
                }

                if (result.assetGuid != guid)
                {
                    guid   = result.assetGuid;
                    buffer = FGTextBufferManager.GetBuffer(guid);
                    if (buffer.IsLoading)
                    {
                        buffer.LoadImmediately();
                    }

                    if (FGCodeWindow.CodeWindows.All(x => x.TargetAssetGuid != guid))
                    {
                        var wnd = FGCodeWindow.OpenAssetInTab(guid);
                        if (wnd)
                        {
                            wnd.OnFirstUpdate();
                        }
                    }
                    if (!buffer.TryEdit())
                    {
                        canEditAll = false;
                    }
                    else
                    {
                        canEditBuffers.Add(buffer);
                    }
                }
            }

            if (!canEditAll)
            {
                if (!EditorUtility.DisplayDialog("Replace", "Some assets are locked and cannot be edited!", "Continue Anyway", "Cancel"))
                {
                    Close();
                }
            }

            buffer = null;
            guid   = null;
            var updatedLines = new HashSet <int>();

            for (var i = flatResults.Count; i-- > 0;)
            {
                var result = flatResults[i];
                if (!result.selected)
                {
                    continue;
                }

                if (result.assetGuid != guid)
                {
                    if (buffer != null)
                    {
                        foreach (var line in updatedLines)
                        {
                            buffer.UpdateHighlighting(line, line);
                        }
                        buffer.EndEdit();
                        FGTextBufferManager.AddBufferToGlobalUndo(buffer);
                        updatedLines.Clear();
                    }

                    guid   = result.assetGuid;
                    buffer = FGTextBufferManager.GetBuffer(guid);

                    if (buffer != null)
                    {
                        if (canEditBuffers.Contains(buffer))
                        {
                            buffer.BeginEdit("*Replace All");
                        }
                        else
                        {
                            buffer = null;
                        }
                    }
                }

                if (buffer != null)
                {
                    var from = new FGTextBuffer.CaretPos {
                        line = result.line, characterIndex = result.characterIndex
                    };
                    var to = new FGTextBuffer.CaretPos {
                        line = result.line, characterIndex = result.characterIndex + result.length
                    };
                    var insertAt = buffer.DeleteText(from, to);
                    if (replaceText != "")
                    {
                        buffer.InsertText(insertAt, replaceText);
                    }

                    updatedLines.Add(result.line);
                }
            }
            if (buffer != null)
            {
                foreach (var line in updatedLines)
                {
                    buffer.UpdateHighlighting(line, line);
                }
                buffer.EndEdit();
                FGTextBufferManager.AddBufferToGlobalUndo(buffer);
            }

            FGTextBufferManager.RecordGlobalUndo();
            Close();
        }