public void OpenFile(AsmProjectFile file, int?line = null, int?column = null, int?length = null) { if (OpenFileAction != null) { OpenFileAction(file, line, column, length); } }
public EditorWindow(MainForm form, AsmProjectFile file, Events events) { MainWindow = form; ProjectFile = file; ModuleEvents = events; Text = ProjectFile.File.Name; }
public Task <IEnumerable <BuildError> > ParseErrors(string sourceCode, AsmProjectFile projectFile) { return(Task.Run(() => { try { return ParseErrorsSync(sourceCode, projectFile); } catch (IOException ex) { if (ex.HResult == -2147024864) { // This task isn't essential, so just suppress IO errors when file is used by other process return new List <BuildError>(); } Log(new LogData("Error testing assembly: " + ex.Message, LogType.Error)); throw ex; } catch (Exception ex) { Log(new LogData("Error testing assembly: " + ex.Message, LogType.Error)); throw ex; } })); }
public void OnFilenameChanged(AsmProjectFile projectFile) { if (FilenameChanged != null) { FilenameChanged(projectFile); } }
public ImagePipelineSettings(AsmProjectFile file, ImageRenderControl image) { _loading = true; _file = file; InitializeComponent(); NewPipelineType.Items.Clear(); NewPipelineType.Items.AddRange(_imagePipelineChoices.Select(o => o.Value).ToArray()); if (file.Pipeline != null) { Pipeline = file.Pipeline.Clone(true); } PaletteReductionPanel = new PaletteReductionSettings(PipelineAsChr, image) { Dock = DockStyle.Top }; ChrPipelinePanel = new ChrPipelineSettings(PipelineAsChr, image) { Dock = DockStyle.Top }; PaletteReductionPanel.PipelineChanged += RegisterChange; ChrPipelinePanel.PipelineChanged += RegisterChange; Controls.Add(ChrPipelinePanel); Controls.Add(PaletteReductionPanel); RefreshLayout(); _loading = false; }
public NavigationData(AsmProjectFile file, Events events) { Text = file.File.Name; Description = file.File.FullName; _navigate = () => events.OpenFile(file); ImageIndex = 1; }
public void AddResult(AsmProjectFile file, List <SearchResult> results, string query) { if (IsDisposed) { return; } BeginInvoke(_addResult, file, results, query); }
public TextEditorWindow(MainForm form, AsmProjectFile file, Events moduleEvents) : base(form, file, moduleEvents) { switch (file.Type) { case FileType.Source: case FileType.Include: TextEditor = new Ca65Editor(ProjectFile, moduleEvents); break; case FileType.Text: default: TextEditor = new TextEditor(); TextEditor.ContextMenuStrip = new TextEditorMenu(moduleEvents); break; } InitializeComponent(); ThreadSafeRefresh = RefreshEditorContents; ThreadSafeRefreshWarning = RefreshWarning; TextEditor.TextChanged += (o, args) => { Pristine = false; RefreshTitle(); }; ProjectFile.ParsedLocalSymbols += ThreadSafeUpdateSymbols; var codeEditor = TextEditor as CodeEditor; if (codeEditor != null) { SourceNavigator.Visible = true; if (ProjectFile.LocalSymbols != null) { SourceNavigator.UpdateSymbols(ProjectFile.LocalSymbols.Where(s => s.Source == ProjectFile.File.FullName)); } codeEditor.ParseErrors = (code) => form.BuildHandler.ParseErrors(code, ProjectFile); codeEditor.AddToWatch = form.AddWatch; codeEditor.AddAddressBreakpoint = (address, types) => { form.AddBreakpoint(address, types, Breakpoint.AddressTypes.Cpu); }; codeEditor.AddSymbolBreakpoint = (symbol, types) => { form.AddBreakpoint(-1, types, Breakpoint.AddressTypes.Cpu, symbol); }; codeEditor.GetCpuMemory = form.GetCpuMemory; codeEditor.ActiveTextAreaControl.Caret.PositionChanged += (sender, args) => { SourceNavigator.CurrentLine = codeEditor.ActiveTextAreaControl.Caret.Line; }; SourceNavigator.Navigated += line => { codeEditor.FocusLine(line, false); codeEditor.Focus(); }; } _savingLock = new object(); }
public Ca65Editor(AsmProjectFile file, Events events) : base(file, events) { _completionDataProvider = new Ca65Completion(File.Project, GetSymbolDescription, events); Document.TextContentChanged += (sender, args) => { }; ActiveTextAreaControl.Caret.PositionChanged += (s, a) => IdentifyLocalLabels(); _labelStartMarker = new TextMarker(0, 1, TextMarkerType.SolidBlock, Document.HighlightingStrategy.GetColorFor("Highlighted word").BackgroundColor); _labelEndMarker = new TextMarker(0, 0, TextMarkerType.SolidBlock, Document.HighlightingStrategy.GetColorFor("Highlighted word").BackgroundColor); }
public Breakpoint GetBreakpoint(AsmProjectFile file = null) { return(new Breakpoint { AddressType = (Breakpoint.AddressTypes)AddressType, Automatic = Automatic, CurrentLine = Line, Disabled = Disabled, StartAddress = StartAddress, EndAddress = EndAddress, Symbol = Symbol, Type = (Breakpoint.Types)Type, File = file }); }
private void RenameFile(AsmProjectFile file, NodeLabelEditEventArgs e) { foreach (var character in Path.GetInvalidFileNameChars()) { if (e.Label.Contains(character)) { e.CancelEdit = true; Program.Error(string.Format("Invalid character '{0}'", character)); return; } } file.File.MoveTo(Path.Combine(file.File.DirectoryName, e.Label)); _events.OnFilenameChanged(file); _project.Pristine = false; // TODO: Update open tabs, and breakpoint list }
public void UpdateFromFile(AsmProjectFile fileInfo) { FileInfo = fileInfo; Text = fileInfo.File.Name; switch (fileInfo.Type) { case FileType.Source: case FileType.Include: ImageIndex = 6; break; case FileType.Image: ImageIndex = 5; break; default: ImageIndex = 4; break; } if (fileInfo.Mode == CompileMode.LinkerConfig) { ImageIndex = 7; } if (fileInfo.Missing) { ImageIndex = 100; ForeColor = SystemColors.GrayText; Text += " (missing)"; } SelectedImageIndex = ImageIndex; if (false && fileInfo.Pipeline != null) // TODO: Display pipeline output in explorer? { foreach (var outputFile in fileInfo.Pipeline.OutputFiles) { if (outputFile == null) { continue; } var file = new FileInfo(outputFile); Nodes.Add(new PipelineNode(fileInfo, file.Name)); } } }
public void FocusNode(AsmProjectFile projectFile) { var node = GetNode <FileNode>(Nodes, n => n.FileInfo == projectFile); if (node == null) { return; } var parent = node.Parent; while (parent != null) { parent.Expand(); parent = parent.Parent; } SelectedNode = node; }
public FileImportInfo(AsmProjectFile projectFile) { ProjectFile = projectFile; IncludeInProject = true; if (projectFile.GetRelativePath().StartsWith("bin/")) { IncludeInProject = false; } if (projectFile.File.Name.StartsWith(".")) { IncludeInProject = false; } if (projectFile.File.Extension == ".nes") { IncludeInProject = false; } }
private void DeleteFile(AsmProjectFile file) { var choice = MessageBox.Show(this, string.Format("Do you want to delete '{0}' permanently?\nThis action cannot be undone", file.File.Name), "Delete file", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); if (choice != DialogResult.OK) { return; } try { file.File.Delete(); } catch (Exception ex) { Program.Error("Failed deleting file:\n" + ex.Message, ex); } _project.RemoveProjectFile(file); // TODO: What if file is open in an editor window }
private void GoToFile(string fileReference) { AsmProjectFile foundFile = null; try { var matchFiles = new[] { Path.Combine(File.GetRelativeDirectory(), fileReference).Replace('\\', '/'), fileReference.Replace('\\', '/') }; var completeMatch = matchFiles.Select(mf => new DirectoryInfo(Path.Combine(File.Project.Directory.FullName, mf)).FullName); foundFile = File.Project.Files.FirstOrDefault(f => completeMatch.Any(mf => mf.Equals(f.File.FullName, StringComparison.InvariantCultureIgnoreCase)) || matchFiles.Any(mf => mf.Equals(f.GetRelativePath(), StringComparison.InvariantCultureIgnoreCase))); } catch { return; } if (foundFile != null) { ModuleEvents.OpenFile(foundFile); } }
private IEnumerable <BuildError> ParseErrorsSync(string sourceCode, AsmProjectFile projectFile) { var errors = new List <BuildError>(); var projectFolder = projectFile.Project.Directory.FullName; var sourceFile = Path.Combine(Path.GetTempPath(), @"ca65temp.s"); var objectFile = Path.Combine(Path.GetTempPath(), @"ca65temp.o"); var configuration = projectFile.Project.CurrentConfiguration; File.WriteAllText(sourceFile, sourceCode); using (var process = new Process()) { process.StartInfo = GetAsmParams(projectFolder); process.EnableRaisingEvents = true; process.OutputDataReceived += OutputReceived; process.ErrorDataReceived += (s, e) => { if (e.Data != null) { errors.Add(new BuildError(e.Data)); } }; var fileDirectory = projectFile.GetRelativeDirectory(); process.StartInfo.Arguments = string.Format("\"{0}\" -o \"{1}\" -t nes --cpu {2}{4} -I .{3}", sourceFile, objectFile, projectFile.Project.GetTargetCpu(), string.IsNullOrWhiteSpace(fileDirectory) ? "" : " -I \"" + fileDirectory + "\"", string.Join("", configuration.Symbols.Select(s => " -D " + s))); process.Start(); process.BeginErrorReadLine(); process.WaitForExit(); } return(errors.Where(e => e.File == sourceFile)); }
public CodeEditor(AsmProjectFile file, Events events) { File = file; ModuleEvents = events; Document.FormattingStrategy = new Ca65Formatting(); _fileCompletionDataProvider = new FileCompletion(new[] { file.Project.Directory, file.File.Directory }, () => { _forcedAutoCompleteWindow = true; ShowIntellisense('/', 0); }); ActiveTextAreaControl.TextArea.InsertLeftMargin(1, new CpuAddressMargin(ActiveTextAreaControl.TextArea, GetDebugLine, file.Project.Type == ProjectType.Snes ? 6 : 4)); Menu = new CodeMenu(events); Menu.Enabled = true; Menu.Name = "Menu"; Menu.Size = new Size(108, 70); ActiveTextAreaControl.TextArea.ContextMenuStrip = Menu; Menu.Opening += (sender, e) => { var word = GetAsmWord(ActiveTextAreaControl.Caret.Position); Menu.CurrentWord = word; }; Menu.GoToDefinition = GoToSymbol; Menu.AddToWatch = () => { var word = GetAsmWord(ActiveTextAreaControl.Caret.Position); if (word == null) { return; } switch (word.WordType) { case AsmWord.AsmWordType.NumberWord: case AsmWord.AsmWordType.NumberByte: AddToWatch(word.Word, word.WordType == AsmWord.AsmWordType.NumberWord); break; case AsmWord.AsmWordType.LabelReference: case AsmWord.AsmWordType.LabelAbsolute: case AsmWord.AsmWordType.LabelDefinition: case AsmWord.AsmWordType.AddressReference: AddToWatch(word.Word, false); break; } }; Menu.BreakOnAccess = (type) => { var word = GetAsmWord(ActiveTextAreaControl.Caret.Position); if (word == null) { return; } switch (word.WordType) { case AsmWord.AsmWordType.NumberWord: case AsmWord.AsmWordType.NumberByte: AddAddressBreakpoint(AddressReference.ParseNumber(word.Word), type); break; case AsmWord.AsmWordType.LabelReference: case AsmWord.AsmWordType.LabelAbsolute: case AsmWord.AsmWordType.LabelDefinition: AddSymbolBreakpoint(word.Word, type); break; } }; Menu.ToggleBreakpoint = ToggleBreakpointAtCaret; Document.HighlightingStrategy = new Ca65Highlighting(File.Project.Type); var testMarker = new TextMarker(0, 0, TextMarkerType.SolidBlock, Document.HighlightingStrategy.GetColorFor("Highlighted word").BackgroundColor); Document.MarkerStrategy.AddMarker(testMarker); /*ActiveTextAreaControl.TextArea.MouseMove += (sender, e) => * { * //Document.MarkerStrategy.RemoveMarker(testMarker); * //ActiveTextAreaControl.TextArea.Invalidate(); * * var textPosition = new Point(e.Location.X - ActiveTextAreaControl.TextArea.LeftMargins.Where(m => m.IsVisible).Sum(m => m.Size.Width), e.Location.Y); * if (textPosition.X < 0 || textPosition.Y < 0) return; * * var position = ActiveTextAreaControl.TextArea.TextView.GetLogicalPosition(textPosition); * if (position.Line >= Document.TotalNumberOfLines) return; * * var line = Document.GetLineSegment(position.Line); * if (line == null) return; * var word = line.GetWord(position.Column); * if (word == null || word.IsWhiteSpace) return; * * return; * //word.SyntaxColor = new HighlightColor(word.Color, Color.DarkGray, true, false); * Document.MarkerStrategy.AddMarker(testMarker); * testMarker.Offset = word.Offset + line.Offset; * testMarker.Length = word.Length; * ActiveTextAreaControl.TextArea.Invalidate(); * };*/ var lineAddressToolTip = new ToolTip(); ActiveTextAreaControl.TextArea.ToolTipRequest += (s, e) => { Document.MarkerStrategy.RemoveMarker(testMarker); ActiveTextAreaControl.TextArea.Invalidate(); if (e.ToolTipShown || e.LogicalPosition.Line >= Document.TotalNumberOfLines) { return; } var line = Document.GetLineSegment(e.LogicalPosition.Line); if (line == null) { return; } lineAddressToolTip.Hide(FindForm()); var word = e.InDocument ? GetAsmWord(e.LogicalPosition) : null; if (word == null || word.IsWhiteSpace || word.WordType == AsmWord.AsmWordType.Comment) { var debugLine = GetDebugLine(line.LineNumber); if (debugLine == null || debugLine.CpuAddress == null) { return; } testMarker.Offset = line.Offset; testMarker.Length = line.Length; Document.MarkerStrategy.AddMarker(testMarker); //e.ShowToolTip(WatchValue.FormatHexAddress(debugLine.Address)); lineAddressToolTip.Show( WatchValue.FormatHexAddress(debugLine.CpuAddress.Value), FindForm(), PointToScreen(new Point(-60, e.MousePosition.Y)) , 3000 // TODO: Use a custom form object, not tooltips ); return; } testMarker.Offset = word.Offset + line.Offset; testMarker.Length = word.Length; Document.MarkerStrategy.AddMarker(testMarker); ActiveTextAreaControl.TextArea.Invalidate(); switch (word.WordType) { case AsmWord.AsmWordType.LabelAbsolute: case AsmWord.AsmWordType.LabelReference: case AsmWord.AsmWordType.LabelDefinition: case AsmWord.AsmWordType.Macro: e.ShowToolTip(GetSymbolDescription(word.Word)); break; case AsmWord.AsmWordType.AddressReference: e.ShowToolTip(GetParsedAddress(word.Word)); break; case AsmWord.AsmWordType.Command: var command = Ca65Parser.GetCommandFromWord(word.Word); if (command != null) { e.ShowToolTip(command.ToString()); } break; case AsmWord.AsmWordType.Opcode: var opcode = OpcodeParser.GetOpcodeFromWord(word.Word, File.Project.Type); if (opcode != null) { e.ShowToolTip(opcode.ToString()); } break; default: e.ShowToolTip(word.Word); break; } }; Document.DocumentAboutToBeChanged += (s, arts) => { _changedSinceLastCheck = true; }; //Document.LineCountChanged += (sender, args) => RefreshErrorInfo(); Document.LineLengthChanged += (s, args) => { if (Document.MarkerStrategy.GetMarkers(args.LineSegment.Offset).Any(m => m is ErrorMarker)) { RefreshErrorInfo(); } }; ActiveTextAreaControl.Caret.PositionChanged += (s, a) => { QueueCareInformation(); if (ActiveTextAreaControl.Caret.Line == _caretLine) { return; } _caretLine = ActiveTextAreaControl.Caret.Line; RefreshErrorInfo(); }; ActiveTextAreaControl.TextArea.KeyUp += delegate(object sender, KeyEventArgs e) { /*if (e.KeyCode == Program.Keys[Brewmaster.Settings.Feature.GoToDefinition]) * { * GoToSymbol(); * return; * }*/ //if (e.KeyCode == Keys.Escape) return; if (NavigationKeys.Contains(e.KeyCode)) { return; } ShowIntellisense((char)e.KeyValue, 1); _forcedAutoCompleteWindow = false; HighlightOpcodeOnLine(); }; ActiveTextAreaControl.TextArea.IconBarMargin.MouseDown += (sender, mousepos, buttons) => { if (buttons != MouseButtons.Left) { return; } var line = ActiveTextAreaControl.TextArea.TextView.GetLogicalLine(mousepos.Y); AddBreakpointMarker(line); RefreshBreakpointsInProject(); }; Document.DocumentChanged += (sender, args) => { var changed = false; foreach (var bp in Document.BookmarkManager.Marks.OfType <BreakpointMarker>()) { if (bp.GlobalBreakpoint.CurrentLine != bp.LineNumber + 1) { changed = true; } bp.GlobalBreakpoint.CurrentLine = bp.LineNumber + 1; } if (changed) { RefreshBreakpointsInProject(); } }; }
public FileNode(AsmProjectFile fileInfo) { UpdateFromFile(fileInfo); }
public PipelineNode(AsmProjectFile fileInfo, string fileName) { _projectFile = fileInfo; Text = fileName; }
// END protected DataPipeline(AsmProjectFile file, DateTime?lastProcessed = null) { File = file; LastProcessed = lastProcessed; }
public SearchResultLineNode(AsmProjectFile file, SearchResult result, string query) { Query = query; Result = result; Text = string.Format("Line {0}, char {1}: ", result.Line, result.Column + 1); // Columns are 1-indexed on the user end }
public SearchResultNode(AsmProjectFile file, List <SearchResult> results, string query) { Text = string.Format("{0} ({1})", file.File.FullName, results.Count); Nodes.AddRange(results.Select(r => new SearchResultLineNode(file, r, query)).ToArray()); }
protected SaveableEditorWindow(MainForm form, AsmProjectFile file, Events events) : base(form, file, events) { }
public ImageWindow(MainForm form, AsmProjectFile file, Events events) : base(form, file, events) { Pristine = true; }
public ChrPipeline(AsmProjectFile file, string chrOutput, string paletteOutput, DateTime?lastProcessed = null) : base(file, lastProcessed) { ChrOutput = chrOutput; PaletteOutput = paletteOutput; PaletteAssignment = new Dictionary <Color, int>(); }
private void MoveFileToPipeline(AsmProjectFile file) { file.Mode = CompileMode.ContentPipeline; _project.Pristine = false; RefreshTree(); }