From 0a66890198de3d1084ad40fa99931c11dfe2099f Mon Sep 17 00:00:00 2001 From: mattias Date: Thu, 16 Apr 2009 08:12:16 +0000 Subject: [PATCH] IDEIntf: added 12x12 images, IDE: messages: icons for message types git-svn-id: trunk@19452 - --- .gitattributes | 7 + ide/checklfmdlg.pas | 4 +- ide/main.pp | 12 +- ide/msgview.pp | 80 +++++++++-- ide/outputfilter.pas | 107 ++------------ ideintf/ideimagesintf.pas | 36 ++++- ideintf/idemsgintf.pas | 95 ++++++++++++- images/laz_images.lrs | 174 +++++++++++++++++++++++ images/laz_images_list.txt | 9 +- images/states/quickfix12x12.png | Bin 0 -> 525 bytes images/states/state12x12_error.png | Bin 0 -> 604 bytes images/states/state12x12_fatal.png | Bin 0 -> 613 bytes images/states/state12x12_hint.png | Bin 0 -> 552 bytes images/states/state12x12_information.png | Bin 0 -> 620 bytes images/states/state12x12_note.png | Bin 0 -> 511 bytes images/states/state12x12_warning.png | Bin 0 -> 592 bytes 16 files changed, 396 insertions(+), 128 deletions(-) create mode 100644 images/states/quickfix12x12.png create mode 100644 images/states/state12x12_error.png create mode 100644 images/states/state12x12_fatal.png create mode 100644 images/states/state12x12_hint.png create mode 100644 images/states/state12x12_information.png create mode 100644 images/states/state12x12_note.png create mode 100644 images/states/state12x12_warning.png diff --git a/.gitattributes b/.gitattributes index 5719476466..74ec26bd13 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3351,12 +3351,19 @@ images/splash_logo.png -text svneol=unset#image/png images/splash_logo.xpm -text svneol=native#image/x-xpixmap images/splash_source/cheetah.jpg -text svneol=unset#image/jpeg images/splash_source/paw.png -text svneol=unset#image/png +images/states/quickfix12x12.png -text images/states/small/state_small_error.png -text svneol=unset#image/png images/states/small/state_small_fatal.png -text svneol=unset#image/png images/states/small/state_small_hint.png -text svneol=unset#image/png images/states/small/state_small_information.png -text svneol=unset#image/png images/states/small/state_small_note.png -text svneol=unset#image/png images/states/small/state_small_warning.png -text svneol=unset#image/png +images/states/state12x12_error.png -text +images/states/state12x12_fatal.png -text +images/states/state12x12_hint.png -text +images/states/state12x12_information.png -text +images/states/state12x12_note.png -text +images/states/state12x12_warning.png -text images/states/state_circular_reference.png -text svneol=unset#image/png images/states/state_error.png -text svneol=unset#image/png images/states/state_fatal.png -text svneol=unset#image/png diff --git a/ide/checklfmdlg.pas b/ide/checklfmdlg.pas index c0967aa7ff..8342ebeea2 100644 --- a/ide/checklfmdlg.pas +++ b/ide/checklfmdlg.pas @@ -228,7 +228,7 @@ var +' Error: ' +ErrorMessage; debugln('WriteLFMErrors ',Msg); - OnOutput(Msg,Dir,-1); + OnOutput(Msg,Dir,-1,nil); end; procedure WriteCodeToolsError; @@ -254,7 +254,7 @@ var +' Error: ' +CurError.ErrorMessage; debugln('WriteLFMErrors ',Msg); - OnOutput(Msg,Dir,-1); + OnOutput(Msg,Dir,-1,nil); CurError:=CurError.NextError; end; end; diff --git a/ide/main.pp b/ide/main.pp index 0d687529d3..9cd2821abe 100644 --- a/ide/main.pp +++ b/ide/main.pp @@ -11076,7 +11076,7 @@ var MaxMessages: integer; Filename, SearchedFilename: string; LogCaretXY: TPoint; TopLine: integer; - MsgType: TErrorType; + MsgType: TFPCErrorType; SrcEdit: TSourceEditor; OpenFlags: TOpenFlags; CurMsg, CurDir: string; @@ -11091,8 +11091,7 @@ begin Index:=0; while (Index'') then begin // the directory was just hidden, re-append it @@ -11173,7 +11172,7 @@ var CurMsg: String; Filename: string; LogCaretXY: TPoint; - MsgType: TErrorType; + MsgType: TFPCErrorType; OldIndex: integer; RoundCount: Integer; begin @@ -11201,8 +11200,7 @@ begin // check if it is an error CurMsg:=MessagesView.VisibleItems[Index].Msg; - if (TheOutputFilter.GetSourcePosition( - CurMsg,Filename,LogCaretXY,MsgType)) then + if (ParseFPCMessage(CurMsg,Filename,LogCaretXY,MsgType)) then begin if MsgType in [etError,etFatal,etPanic] then break; end; diff --git a/ide/msgview.pp b/ide/msgview.pp index b38881f57e..b95a01f38c 100644 --- a/ide/msgview.pp +++ b/ide/msgview.pp @@ -118,6 +118,12 @@ type FLastSelectedIndex: integer; ImgIDNone: integer; ImgIDHasQuickFix: integer; + ImgIDInformation: integer; + ImgIDHint: integer; + ImgIDNote: integer; + ImgIDWarning: integer; + ImgIDError: integer; + ImgIDFatal: integer; function GetSelectedLineIndex: integer; procedure SetSelectedLineIndex(const AValue: integer); function FindNextItem(const Filename: string; @@ -125,6 +131,7 @@ type procedure UpdateMsgSrcPos(Line: TLazMessageLine); function GetLines(Index: integer): TIDEMessageLine; override; procedure Changed; + procedure SetTVNodeImage(TVNode: TTreeNode; Msg: TLazMessageLine); public ControlDocker: TLazControlDocker; constructor Create(TheOwner: TComponent); override; @@ -133,8 +140,10 @@ type procedure EndUpdateNotification(Sender: TObject); procedure DeleteLine(Index: integer); procedure Add(const Msg, CurDir: string; - ProgressLine, VisibleLine: boolean; OriginalIndex: integer); - procedure AddMsg(const Msg, CurDir: string; OriginalIndex: integer); override; + ProgressLine, VisibleLine: boolean; OriginalIndex: integer; + Parts: TStrings); + procedure AddMsg(const Msg, CurDir: string; OriginalIndex: integer; + Parts: TStrings = nil); override; procedure AddProgress(ScanLine: TIDEScanMessageLine); procedure AddSeparator; procedure CollectLineParts(Sender: TObject; SrcLines: TIDEMessageLineList); @@ -305,9 +314,15 @@ begin FLastSelectedIndex := -1; FQuickFixItems:=TFPList.Create; - ImgIDNone := IDEImages.LoadImage(16, 'state_error'); - ImgIDHasQuickFix := IDEImages.LoadImage(16, 'ce_function'); - MessageTreeView.Images:=IDEImages.Images_16; + ImgIDNone := -1; + ImgIDInformation := IDEImages.LoadImage(12, 'state12x12_information'); + ImgIDHint := IDEImages.LoadImage(12, 'state12x12_hint'); + ImgIDNote := IDEImages.LoadImage(12, 'state12x12_note'); + ImgIDWarning := IDEImages.LoadImage(12, 'state12x12_warning'); + ImgIDError := IDEImages.LoadImage(12, 'state12x12_error'); + ImgIDFatal := IDEImages.LoadImage(12, 'state12x12_fatal'); + ImgIDHasQuickFix := IDEImages.LoadImage(12, 'quickfix12x12'); + MessageTreeView.Images:=IDEImages.Images_12; Caption := lisMenuViewMessages; MessageTreeView.OnAdvancedCustomDrawItem := @MessageViewDrawItem; @@ -400,7 +415,8 @@ end; TMessagesView.Add ------------------------------------------------------------------------------} procedure TMessagesView.Add(const Msg, CurDir: string; - ProgressLine, VisibleLine: boolean; OriginalIndex: integer); + ProgressLine, VisibleLine: boolean; OriginalIndex: integer; + Parts: TStrings); var NewMsg: TLazMessageLine; i: integer; @@ -432,6 +448,12 @@ begin NewMsg.Directory := CurDir; NewMsg.Position := FItems.Count-1; NewMsg.OriginalIndex := OriginalIndex; + if Parts<>nil then + begin + if NewMsg.Parts=nil then + NewMsg.Parts:=TStringList.Create; + NewMsg.Parts.Assign(Parts); + end; //DebugLn('TMessagesView.Add FItems.Count=',dbgs(FItems.Count),' OriginalIndex=',dbgs(OriginalIndex)); if VisibleLine then @@ -449,11 +471,10 @@ begin // add new line TVNode:=MessageTreeView.Items.Add(nil,Msg);// add line end; - TVNode.ImageIndex:=ImgIDNone; - TVNode.SelectedIndex:=ImgIDNone; NewMsg.VisiblePosition := FVisibleItems.Count; FVisibleItems.Add(NewMsg); FLastLineIsProgress := ProgressLine; + SetTVNodeImage(TVNode,NewMsg); if MessageTreeView.Items.Count>0 then MessageTreeView.Items.TopLvlItems[MessageTreeView.Items.Count-1].MakeVisible; //DebugLn(['TMessagesView.Add ',MessageTreeView.TopIndex]); @@ -462,19 +483,20 @@ begin Changed; end; -procedure TMessagesView.AddMsg(const Msg, CurDir: string; OriginalIndex: integer); +procedure TMessagesView.AddMsg(const Msg, CurDir: string; OriginalIndex: integer; + Parts: TStrings); begin - Add(Msg, CurDir, False, True, OriginalIndex); + Add(Msg, CurDir, False, True, OriginalIndex, Parts); end; procedure TMessagesView.AddProgress(ScanLine: TIDEScanMessageLine); begin - Add(ScanLine.Line, ScanLine.WorkingDirectory, True, True,ScanLine.LineNumber); + Add(ScanLine.Line, ScanLine.WorkingDirectory, True, True,ScanLine.LineNumber,nil); end; procedure TMessagesView.AddSeparator; begin - Add(SeparatorLine, '', False, True, -1); + Add(SeparatorLine, '', False, True, -1, nil); end; procedure TMessagesView.CollectLineParts(Sender: TObject; @@ -646,8 +668,7 @@ begin begin TVNode:=MessageTreeView.Items.Add(nil,Line.Msg); end; - TVNode.ImageIndex:=ImgIDNone; - TVNode.SelectedIndex:=ImgIDNone; + SetTVNodeImage(TVNode,Line); end; while MessageTreeView.Items.Count > FVisibleItems.Count do MessageTreeView.Items.TopLvlItems[MessageTreeView.Items.Count - 1].Free; @@ -1206,6 +1227,37 @@ begin IdleTimer1.AutoEnabled:=true; end; +procedure TMessagesView.SetTVNodeImage(TVNode: TTreeNode; Msg: TLazMessageLine + ); +var + Typ: string; + ImgID: LongInt; +begin + ImgID:=ImgIDNone; + if (lmlfHasQuickFixValid in Msg.Flags) + and (lmlfHasQuickFix in Msg.Flags) then + ImgID:=ImgIDHasQuickFix + else if Msg.Parts<>nil then begin + if Msg.Parts.Values['Stage']='FPC' then begin + Typ:=Msg.Parts.Values['Type']; + if Typ='Hint' then + ImgID:=ImgIDHint + else if Typ='Note' then + ImgID:=ImgIDNote + else if Typ='Warning' then + ImgID:=ImgIDWarning + else if Typ='Error' then + ImgID:=ImgIDError + else if Typ='Fatal' then + ImgID:=ImgIDFatal + else + ImgID:=ImgIDInformation; + end; + end; + TVNode.ImageIndex:=ImgID; + TVNode.SelectedIndex:=TVNode.ImageIndex; +end; + procedure TMessagesView.ConsistencyCheck; var i: Integer; diff --git a/ide/outputfilter.pas b/ide/outputfilter.pas index 727fd7bb0f..3654ec95f3 100644 --- a/ide/outputfilter.pas +++ b/ide/outputfilter.pas @@ -45,7 +45,7 @@ type TOnOutputString = procedure(Line: TIDEScanMessageLine) of object; TOnAddFilteredLine = procedure(const Msg, Directory: String; - OriginalIndex: integer) of object; + OriginalIndex: integer; Parts: TStrings) of object; TOnGetIncludePath = function(const Directory: string; UseCache: boolean): string of object; @@ -60,8 +60,6 @@ type TOutputMessageType = (omtNone, omtFPC, omtLinker, omtMake); - TErrorType = (etNone, etHint, etNote, etWarning, etError, etFatal, etPanic); - { TFilteredOutputLines A TStringList maintaining an original index for each string. TOutputFilter creates an instance of this class as a result of filtering @@ -116,7 +114,7 @@ type FOnEndUpdate: TNotifyEvent; fOnReadLine: TOnOutputString; fOutput: TIDEMessageLineList; - fLastErrorType: TErrorType; + fLastErrorType: TFPCErrorType; fLastMessageType: TOutputMessageType; fCompilingHistory: TStringList; fMakeDirHistory: TStringList; @@ -133,7 +131,6 @@ type FAsyncOutput: TDynamicDataQueue; FScanners: TFPList; // list of TIDEMsgScanner FTool: TIDEExternalToolOptions; - DarwinLinkerMultiline: Boolean; DarwinLinkerLine : String; procedure DoAddFilteredLine(const s: string; OriginalIndex: integer = -1); @@ -154,8 +151,6 @@ type Aborted: boolean; function Execute(TheProcess: TProcessUTF8; aCaller: TObject = nil; aTool: TIDEExternalToolOptions = nil): boolean; - function GetSourcePosition(const Line: string; var Filename:string; - var CaretXY: TPoint; var MsgType: TErrorType): boolean; procedure Clear; constructor Create; destructor Destroy; override; @@ -178,7 +173,7 @@ type property FilteredLines: TFilteredOutputLines read fFilteredOutput; property StopExecute: boolean read FStopExecute write SetStopExecute; property Lines: TIDEMessageLineList read fOutput; - property LastErrorType: TErrorType read fLastErrorType; + property LastErrorType: TFPCErrorType read fLastErrorType; property LastMessageType: TOutputMessageType read fLastMessageType; property OnGetIncludePath: TOnGetIncludePath read fOnGetIncludePath write fOnGetIncludePath; @@ -210,24 +205,10 @@ var TOutputFilterProcess: TProcessClass = nil; MessageScanners: TMessageScanners = nil; -const - ErrorTypeNames : array[TErrorType] of string = ( - 'None','Hint','Note','Warning','Error','Fatal','Panic' - ); - -function ErrorTypeNameToType(const Name:string): TErrorType; - implementation -function ErrorTypeNameToType(const Name:string): TErrorType; -begin - for Result:=Succ(etNone) to High(TErrorType) do - if CompareText(ErrorTypeNames[Result],Name)=0 then exit; - Result:=etNone; -end; - { TOutputFilter } constructor TOutputFilter.Create; @@ -492,7 +473,7 @@ const AsmError = 'Error while assembling'; var i, j, FilenameEndPos: integer; MsgTypeName, Filename, Msg: string; - MsgType: TErrorType; + MsgType: TFPCErrorType; SkipMessage: boolean; CurCompHistory: string; CurFilenameLen: Integer; @@ -576,7 +557,7 @@ var i, j, FilenameEndPos: integer; CurrentMessageParts.Values['Stage']:='Linker' else CurrentMessageParts.Values['Stage']:='FPC'; - CurrentMessageParts.Values['Type']:=ErrorTypeNames[fLastErrorType]; + CurrentMessageParts.Values['Type']:=FPCErrorTypeNames[fLastErrorType]; NewLine:=copy(s,p,length(s)); if fLastErrorType in [etPanic,etFatal] then begin @@ -614,7 +595,7 @@ var i, j, FilenameEndPos: integer; DoAddFilteredLine(copy(s,p,length(s))); fLastErrorType:=etNote; CurrentMessageParts.Values['Stage']:='FPC'; - CurrentMessageParts.Values['Type']:=ErrorTypeNames[fLastErrorType]; + CurrentMessageParts.Values['Type']:=FPCErrorTypeNames[fLastErrorType]; Result:=true; exit; end; @@ -871,14 +852,14 @@ begin if (j+1>length(s)) or (s[j]<>':') or (s[j+1]<>' ') then exit; MessageStartPos:=j+2; MsgTypeName:=copy(s,i,j-i); - for MsgType:=Succ(etNone) to High(TErrorType) do begin - if ErrorTypeNames[MsgType]=MsgTypeName then begin + for MsgType:=Succ(etNone) to High(TFPCErrorType) do begin + if FPCErrorTypeNames[MsgType]=MsgTypeName then begin // this is a freepascal compiler message // -> filter message fLastErrorType:=MsgType; fLastMessageType:=omtFPC; CurrentMessageParts.Values['Stage']:='FPC'; - CurrentMessageParts.Values['Type']:=ErrorTypeNames[fLastErrorType]; + CurrentMessageParts.Values['Type']:=FPCErrorTypeNames[fLastErrorType]; CurrentMessageParts.Values['Line']:= copy(s,LineNumberStartPos,LineNumberEndPos-LineNumberStartPos); CurrentMessageParts.Values['Column']:= @@ -1020,74 +1001,6 @@ begin end; end; -function TOutputFilter.GetSourcePosition(const Line: string; var Filename:string; - var CaretXY: TPoint; var MsgType: TErrorType): boolean; -{ This assumes the line has one of the following formats -(123,45) : -(123) : -(456) : in line (123) -Fatal: -} -var StartPos, EndPos: integer; -begin - Result:=false; - if copy(Line,1,7)='Fatal: ' then begin - Result:=true; - Filename:=''; - MsgType:=etFatal; - exit; - end; - StartPos:=1; - // find filename - EndPos:=StartPos; - while (EndPos<=length(Line)) and (Line[EndPos]<>'(') do inc(EndPos); - if EndPos>length(Line) then exit; - FileName:=copy(Line,StartPos,EndPos-StartPos); - // read linenumber - StartPos:=EndPos+1; - EndPos:=StartPos; - while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); - if EndPos>length(Line) then exit; - CaretXY.X:=1; - CaretXY.Y:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); - if Line[EndPos]=',' then begin - // format: (123,45) : - // read column - StartPos:=EndPos+1; - EndPos:=StartPos; - while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); - if EndPos>length(Line) then exit; - CaretXY.X:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); - // read error type - StartPos:=EndPos+2; - while (EndPos<=length(Line)) and (Line[EndPos]<>':') do inc(EndPos); - if EndPos>length(Line) then exit; - MsgType:=ErrorTypeNameToType(copy(Line,StartPos,EndPos-StartPos)); - Result:=true; - end else if Line[EndPos]=')' then begin - // (123) : - // (456) : in line (123) - // read error type - StartPos:=EndPos+2; - while (EndPos<=length(Line)) and (Line[EndPos]<>':') do inc(EndPos); - if EndPos>length(Line) then exit; - MsgType:=ErrorTypeNameToType(copy(Line,StartPos,EndPos-StartPos)); - // read second linenumber (more useful) - while (EndPos<=length(Line)) and (Line[EndPos]<>'(') do inc(EndPos); - if EndPos>length(Line) then begin - // format: (123) : - Result:=true; - exit; - end; - StartPos:=EndPos+1; - EndPos:=StartPos; - while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); - if EndPos>length(Line) then exit; - CaretXY.Y:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); - Result:=true; - end; -end; - function TOutputFilter.IsHintForUnusedUnit(const OutputLine, MainSrcFile: string): boolean; { recognizes hints of the form @@ -1126,7 +1039,7 @@ begin fFilteredOutput.Add(s); fFilteredOutput.OriginalIndices[fFilteredOutput.Count-1]:=OriginalIndex; if Assigned(OnAddFilteredLine) then - OnAddFilteredLine(s,fCurrentDirectory,OriginalIndex); + OnAddFilteredLine(s,fCurrentDirectory,OriginalIndex,CurrentMessageParts); end; procedure TOutputFilter.DoAddLastLinkerMessages(SkipLastLine: boolean); diff --git a/ideintf/ideimagesintf.pas b/ideintf/ideimagesintf.pas index 1a3837012c..b6ddba6b87 100644 --- a/ideintf/ideimagesintf.pas +++ b/ideintf/ideimagesintf.pas @@ -33,11 +33,14 @@ type TIDEImages = class private + FImages_12: TCustomImageList; FImages_16: TCustomImageList; FImages_24: TCustomImageList; + FImageNames_12: TStringList; FImageNames_16: TStringList; FImageNames_24: TStringList; protected + function GetImages_12: TCustomImageList; function GetImages_16: TCustomImageList; function GetImages_24: TCustomImageList; public @@ -47,6 +50,7 @@ type function GetImageIndex(ImageSize: Integer; ImageName: String): Integer; function LoadImage(ImageSize: Integer; ImageName: String): Integer; + property Images_12: TCustomImageList read GetImages_12; property Images_16: TCustomImageList read GetImages_16; property Images_24: TCustomImageList read GetImages_24; end; @@ -60,6 +64,17 @@ var { TIDEImages } +function TIDEImages.GetImages_12: TCustomImageList; +begin + if FImages_12 = nil then + begin + FImages_12 := TImageList.Create(nil); + FImages_12.Width := 12; + FImages_12.Height := 12; + end; + Result := FImages_12; +end; + function TIDEImages.GetImages_16: TCustomImageList; begin if FImages_16 = nil then @@ -84,8 +99,9 @@ end; constructor TIDEImages.Create; begin - FImages_16 := nil; - FImages_24 := nil; + FImageNames_12 := TStringList.Create; + FImageNames_12.Sorted := True; + FImageNames_12.Duplicates := dupIgnore; FImageNames_16 := TStringList.Create; FImageNames_16.Sorted := True; FImageNames_16.Duplicates := dupIgnore; @@ -96,10 +112,12 @@ end; destructor TIDEImages.Destroy; begin - FImages_16.Free; - FImages_24.Free; - FImageNames_16.Free; - FImageNames_24.Free; + FreeAndNil(FImages_12); + FreeAndNil(FImages_16); + FreeAndNil(FImages_24); + FreeAndNil(FImageNames_12); + FreeAndNil(FImageNames_16); + FreeAndNil(FImageNames_24); inherited Destroy; end; @@ -108,6 +126,7 @@ var List: TStringList; begin case ImageSize of + 12: List := FImageNames_12; 16: List := FImageNames_16; 24: List := FImageNames_24; else @@ -132,6 +151,11 @@ begin if Result <> -1 then Exit; case ImageSize of + 12: + begin + List := Images_12; // make sure we have a list + Names := FImageNames_12; + end; 16: begin List := Images_16; // make sure we have a list diff --git a/ideintf/idemsgintf.pas b/ideintf/idemsgintf.pas index a31629689a..17da9605eb 100644 --- a/ideintf/idemsgintf.pas +++ b/ideintf/idemsgintf.pas @@ -239,7 +239,7 @@ type function GetLines(Index: integer): TIDEMessageLine; virtual; abstract; public procedure Clear; virtual; abstract; - procedure AddMsg(const Msg, CurDir: string; OriginalIndex: integer); virtual; abstract; + procedure AddMsg(const Msg, CurDir: string; OriginalIndex: integer; Parts: TStrings = nil); virtual; abstract; property Lines[Index: integer]: TIDEMessageLine read GetLines; default; function LinesCount: integer; virtual; abstract; procedure BeginBlock(ClearOldBlocks: Boolean = true); virtual; abstract; @@ -259,6 +259,18 @@ function RegisterIDEMsgQuickFix(const Name, Caption, RegExpr: string; procedure RegisterIDEMsgScanner(Item: TIDEMsgScannerType); +type + TFPCErrorType = (etNone, etHint, etNote, etWarning, etError, etFatal, etPanic); + +const + FPCErrorTypeNames : array[TFPCErrorType] of string = ( + 'None','Hint','Note','Warning','Error','Fatal','Panic' + ); + +function FPCErrorTypeNameToType(const Name:string): TFPCErrorType; +function ParseFPCMessage(const Line: string; out Filename:string; + out CaretXY: TPoint; out MsgType: TFPCErrorType): boolean; + implementation procedure RegisterIDEMsgQuickFix(Item: TIDEMsgQuickFixItem); @@ -286,6 +298,87 @@ begin IDEMsgScanners.RegisterType(Item); end; +function FPCErrorTypeNameToType(const Name: string): TFPCErrorType; +begin + for Result:=Succ(etNone) to High(TFPCErrorType) do + if CompareText(FPCErrorTypeNames[Result],Name)=0 then exit; + Result:=etNone; +end; + +function ParseFPCMessage(const Line: string; out Filename: string; out + CaretXY: TPoint; out MsgType: TFPCErrorType): boolean; +{ This assumes the line has one of the following formats +(123,45) : +(123) : +(456) : in line (123) +Fatal: +} +var StartPos, EndPos: integer; +begin + Result:=false; + if copy(Line,1,7)='Fatal: ' then begin + Result:=true; + Filename:=''; + MsgType:=etFatal; + exit; + end; + if copy(Line,1,7)='Panic: ' then begin + Result:=true; + Filename:=''; + MsgType:=etPanic; + exit; + end; + StartPos:=1; + // find filename + EndPos:=StartPos; + while (EndPos<=length(Line)) and (Line[EndPos]<>'(') do inc(EndPos); + if EndPos>length(Line) then exit; + FileName:=copy(Line,StartPos,EndPos-StartPos); + // read linenumber + StartPos:=EndPos+1; + EndPos:=StartPos; + while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); + if EndPos>length(Line) then exit; + CaretXY.X:=1; + CaretXY.Y:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); + if Line[EndPos]=',' then begin + // format: (123,45) : + // read column + StartPos:=EndPos+1; + EndPos:=StartPos; + while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); + if EndPos>length(Line) then exit; + CaretXY.X:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); + // read error type + StartPos:=EndPos+2; + while (EndPos<=length(Line)) and (Line[EndPos]<>':') do inc(EndPos); + if EndPos>length(Line) then exit; + MsgType:=FPCErrorTypeNameToType(copy(Line,StartPos,EndPos-StartPos)); + Result:=true; + end else if Line[EndPos]=')' then begin + // (123) : + // (456) : in line (123) + // read error type + StartPos:=EndPos+2; + while (EndPos<=length(Line)) and (Line[EndPos]<>':') do inc(EndPos); + if EndPos>length(Line) then exit; + MsgType:=FPCErrorTypeNameToType(copy(Line,StartPos,EndPos-StartPos)); + // read second linenumber (more useful) + while (EndPos<=length(Line)) and (Line[EndPos]<>'(') do inc(EndPos); + if EndPos>length(Line) then begin + // format: (123) : + Result:=true; + exit; + end; + StartPos:=EndPos+1; + EndPos:=StartPos; + while (EndPos<=length(Line)) and (Line[EndPos] in ['0'..'9']) do inc(EndPos); + if EndPos>length(Line) then exit; + CaretXY.Y:=StrToIntDef(copy(Line,StartPos,EndPos-StartPos),-1); + Result:=true; + end; +end; + { TIDEMsgQuickFixItem } function TIDEMsgQuickFixItem.GetCaption: string; diff --git a/images/laz_images.lrs b/images/laz_images.lrs index fde24d8942..0b2f692fb8 100644 --- a/images/laz_images.lrs +++ b/images/laz_images.lrs @@ -8079,6 +8079,180 @@ LazarusResources.Add('menu_view_unit_info','PNG',[ +'l'#132'&'#233#207#21#200'q4'#245'U'#249#156'h'#172#228#15#159'8+'#215#137 +#209'Hq'#0#0#0#0'IEND'#174'B`'#130 ]); +LazarusResources.Add('state12x12_error','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#15#13 + +#21'$Wh'#192'G'#0#0#1#220'IDAT('#207#141#142#205'KTQ'#0'G'#207#189#239#141 + +#230#140#243#225#216#136#201#132'Q'#134#16#140#171#192'E'#155#2#7#13#135#178 + +'E-'#146#22#213'&w'#173#250#7'l'#219#178'EK'#219#247'-'#132'('#18#20#129#139 + +'"'#16#146'B'#195'2'#6'GgD'#223#188'7'#243'>'#238#187#183#133#217#186#223#242 + +'p'#14#252#0#8#31#206#240#191#179#131#217'{'#248#174#251#15#248#15#166'+'#164 + +'3SZ'#202#30#21#248#205#168'Q'#158''#252#234#141#0#179'}'#167','#196#145'h' + +'f'#239#246#5#17'O'#195#227#3#227'V'#190#7#217':@'''#179#248#219'5'#194#159 + +#235'Kq'#216#154'.>y'#187'#'#143#130'v'#160#231#212#224#217#241#142'B'#222'H' + +#223#213#214#200#133'X'#182#155'qj'#160#223'$'#134'KcQd'#230'~'#205#140#217 + +#18#160'y'#255'z%'#236'=1ag'#211'&ZY'#22#198'H'#153#24'-[q'#132#213#254#176 + +','#146#249'^'#172#226#153#9'g'#219#153#148#0'*'#213'}'#205#238'+'#160'7'#191 + +#27#141#133'1'#135'OulP'#177#196'_['#163#171#191#136#238'JM'#29#6#144#151#24 + +#162'z'#221'hc'#163#154#222'a`,b%'#8'j'#187#136'X'#255#245#128#208#245#28#21 + +#25'H'#230'P'#190'B'#237#237#225''#250'H'#180''#128'j'#5#136#238#28'*6'#4 + +#174#235'H'#0#175'V}'#230'lnb'#157#28#146'Q'#179'El'''#233','#157'G'#181'C"?' + +#164'sh'#152#198#143'ox;'#181#23#2#224'2'#136'G7/.dFF'#203#233'\'#1'c'#131 + +'8'#214#0#28';u'#154#198#238'o'#182#222'/,'#186#222'A'#197#2'X'#7'n'#15'f'#22 + +#188#234#214'H'#168#197'Pb'#160#136'Hva'#178'Yj'#235'_'#169#174#188'['#242 + +#156#250#173'+'#159#235#142#0'X'#173#148'Di~'#213',^*'#218#29#170'c'#210#206 + +#244'\5'#9';'#23#181'Zn'#187#190#243#210#213#193#252#141'/'#251#225#235's)' + +#241#7'T2'#232'0'#206#184#226#152#0#0#0#0'IEND'#174'B`'#130 +]); +LazarusResources.Add('state12x12_fatal','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#15#13 + +#29'&q'#191'+c'#0#0#1#229'IDAT('#207'u'#142';kSa'#0'@'#207'}'#228'K'#154#246 + +'j5M'#155#18#197#197#193#201'A-'#190'@'#196#185#191#192'EG''A'#16#7#17#28#186 + +'*XJAg'''#133#214#197'M'#165'E'#20'D)'#136'HQ'#164'M'#172'`r'#147#154#222#220 + +#231#151#239'>>'''#187'y'#214#195#129'C'#186#189'h'#164#219#139'&'#255'!}' + +#205'i'#0#173#207#27#197';0'#254#9#181#245#232#138'e'#26#215#204#170#222#160 + +'R'#188#252#180'z'#251#207#201#217#226#186'mr'#235#249#145'W_W'#10'%'#17#17#241'D'#196'3"'#229 + +#138'H'#169'"'#226#254#240#164#207'ykv'#159#184#29#13#0#16#191#186'5'#214#28 + +#218#22#14#213#241'q'#201'Ck'#197'z'#5'<'#3#133'5C{4'#200#222#214#136'j'#217 + +#18#218'Um0'#2#128#0#229#10'hS'#245#181'R'#8#10#207#248''''#136#6' '#219#187 + +#188#152'/.'#187#197'2{'#182#7#216#217'd'#17'n'#176'('#150#161'%'#18'@'#140 + +#199#251#207'.K'#238#234'BM'#1'i;'#144#156#155#253#148#239'z'#243'.'#183'yf>' + +'W'#136#183'6'#6#227#209'z'#149#255#230'rwb'#158#169#185#220#233#215#215#186 + +#159'W'#181#245#17#15#2#180#159't'#14#223#28#155#149'{S'#217'R2='#254#176#243 + +#194#131'}'#0#189'w'#166'7T=8'#196#217#27#147#26#224'P'#207#163#200#153#235 + +#147'3'#231#134'_:;'#142#222#218'_'#163#234's'#166'5m'#151'~'#251#162']'#157 + +'t|'#240'Yc'#226#242#227#142'Z'#188#187',xl'#224#169#2'85'#244#226#143#215 + +#219#191#214's&'#178#214#145'+O,'#128'dz'#220#207#253#4'lF'#169#217#3#210#216 + +#10#0#0#0#0'IEND'#174'B`'#130 +]); +LazarusResources.Add('state12x12_information','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#15#13 + +#30'4'#169'+'#9#232#0#0#1#236'IDAT('#207#141#144#205'K'#211'a'#0#199'?'#207 + +#179#141'9'#157'NN'#231#11'Ct6'#195'(2;'#137#151#4'Kp'#161']'#234#16'A'#20 + +#157#163''#161'C'#29#130#160'Ku."'#162'W'#168#139'$'#209#193#222#14'F'#164 + +#205#212#202#176'Y'#206'm'#186'7]'#191#151#231#247'tr'#231'>'#199'/'#159#239 + +#229#3#192#196#173'$'#255#139#247#248#205'yV'#230'S'#213'a'#232#218#167'D' + +#179'_L:'#202'i'#178']UZ/'#236'<'#153#191'<'#245#28#174'j'#227#228'C!'#170 + +#226#245'dk'#16#235#206'@'#135#239'X<\'#139'r\'#16'0'#183#150#231#221'Rvz' + +#245'W'#254#244#198#189'S'#27#158#221'C'#223#209#243#143'Fbuc'#253#145'Z'#157 + +'.'#152'Z'#185#218'-Tl'#189''''#18#20'F'#141#140'e6'#138#251#255#4#142'<'#144 + +#0#135#175'|H'#28#140#248#198#186#141#26#253':'#153#21'J)yv'#164#203#131'P' + +#158#247'K'#25#17#235#12'1'#184#215#24#139'Gj'#198'%@c@'#158#136#183#212#241 + +'5U'#208#218#181#177'l'#155#31#233'2'#21#211#196'U&'#11#171'9'#250'{'#194#180 + +#248#153#148#0'N'#197'4'#132#212'lnW'#180'i'#153#128'b'#160#199' '#232#147'X' + +#166#195'Vq'#27'/'#26#143#182#12#9'`Zf'#209'V'#138#128'O'#226#216#10#180#6' ' + +#224#149#152';'#21#252'h'#254'*'#7#165#236#162#4'H'#167#11#143#231'~f'#232'n' + +#171#151'B'#185#196#219#235'IeJ'#244#182#5#209#182'E'#180'=D'#242'K'#138#220 + +'V'#241#233'nV1x'#238#254#212#232'P'#215'hg{'#3#179#201#20#217'\'#153'P'#192 + +#203#190#190#14#210#217'' + +#179#190'r'#187'('#0#130#195'7Dy'#230#162'nn'#189#228'm>'#20#29'oi'#242'Ox' + +#177#26#29'W'#151's'#155#165'g'#165#197'o/'#214'V'#239'Z'#173'}'#23#196'?Q' + +#137#224#231'J'#17#25#202#0#0#0#0'IEND'#174'B`'#130 +]); +LazarusResources.Add('state12x12_note','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#15#13 + +#31#28#133#133#144'S'#0#0#1'IDAT('#207#149#145#207'j'#19'Q'#28#133#191#219 + +';I'''#197#16#26#164'"'#130#237#174' u'#217'G'#168#11'7'#197#226#202'M'#31 + +#196#173'K'#241'!'#250#2'.'#180#130#212''''#16#193#10#182#130'('#193#218#210 + +'h*'#25#147#204#204#157#251#231#247'sa*'#186#244#219#159#243#29'8'#164#193#11 + +#195'`'#0'T'#149#176#183'i'#143'w'#223#208#0'S '#0'%P'#1#3'`'#247#14#172#190 + +#212#244';P'#30'X'#249#30#171#148#164#173#201''''#141#1#141#30'M'#14'B'#141 + +#164'`'#227#232#131'o'#142#158#246#0'8'#4#27#6#7#250'7'#162#255'2y'#245'P' + +#223'^!'#207#0#134#192'zY$S'#29#219'T~TP'#163#226'@'#26'$'#140#177#189#13#146 + +'+'#146'$'#200#152'o'#213#212#160'L'#209'tn@'#208'0A'#194#12#241'C'#22#242'.' + +#26'JB='#15'('#16'&'#223#224#162'E,N@'#192#228'`'#22#5#21#15#8#26'+'#18#176#0 + +#176#190#5'~tD'#250'9'#161#179'z'#15#147']%'#142#207'1:Cc'#1#226#16'_'#227 + +#152#27':9'#24'k'#169'?='#199#216#11#178#229#27#248#241#8'q'#5#234'N'#145'P ' + +#161'B/'#13'{'#207' '#235#174#216#165'['#219'L'#15#247'q_'#222#211#234'o'#210 + +'Z'#217#162'u}'#155#172#191#129#198#169#141#151#199'}'#190#143#237#238#236'T' + +'fi'#185#29''#12'R'#152#156#209#238#175'a'#178'E'#180')Q)'#173'?}'#231'g' + +#175#235#222#159#167'O'#30#221#204#135'O'#190'r'#237#1#132#14#156'='#6'7ol' + +#128#181#187'p{_'#221'/'#245'W'#242#219'g_7='#0#0#0#0'IEND'#174'B`'#130 +]); +LazarusResources.Add('state12x12_warning','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#15#13 + +#31'; '#143'%8'#0#0#1#208'IDAT('#207'u'#143'OH'#147'q'#24#199'?'#239'o'#203 + +'?cm'#6#145#147'$'#163#197#234'0'#219#236#175#129#8']'#130' H'#202'X'#30#130 + +#130'NQ'#208'%'#162'S'#135'N'#209#173'"'#179'K1Hd'#29#178#131#211#131't'#177 + +'<'#20#154#132#29#150#209#218#212#218#180#173'e'#211#182#247#253#189#239#211 + +#161'B;'#248#129#231#242'|'#159#239#247#203#3'kX'#28#237#160#240'*'#230'Z' + +#187#251'6vF'#177#30#243'C'#7#1'X'#24#137#180#228#147#145''''#249#225'H'#0' ' + +'7'#20']'#223#244''''#245#228#200#210#135#7#146#31'='#30#7#16#17#3#224's' + +#235#234'Qn'#248#128#2#152#237'w'#29'-'#189#187')""'#133#215'W%'#253#200#223 + +#9#144'M'#180#173#182#228#146#237#198#170#177#227#141#249#227#189#152#197#1 + +#219#252#254'V2'#137#253'/'#255'i3}'#155#141#255'x'#22#186#188#252').'#229 + +#249#164#158#234#221')'#229#236#128#148#166'{%'#213#215't'#17#224'c<'#236'fn' + +'p'#159#1#144#186'E`q'#236#194#172#216'E)L'#158#182''''#239#237#149#194'D' + +#183#163'WR'#146'y'#222'37~'#142#0#128'j'#238#154#16#0#239#174#182#219#158 + +#237#221#205'NeZ+'#151#161#234#26'6b[eC*/l_'#232#212'V'#223#158#166'k'#0'.' + +#128#153#187'D'#189#161#158#251#190#221'g1'#191#220'Q`'#130'QO'#141#199#192 + +#208'i'#229#217'v'#130#242#215'B{W'#205#212#160#2#240#236'8v'#195#27':'#143 + +'U|'#234#136#206#160#171'?1'#151'r('#151#6#187#136#181#240#144#198'C1'#252 + +#225#214#235#238#244#227#134#241#186'@'#231'a'#183'g'#11#246'rP)'#255'%'#234 + +'7'#185#241#182'(lS#'#142#3'N'#149'Zo'#16'_'#240'H'#204#200'&'#194'W'#196#240 + +'D'#29'm7'#138'Sk'#137#13#182#214#232'_'#22#186'b'#254#29#7'k'#165#180#193 + +#169'V'#242#191#1#197'D'#213'Z'#128#171#150#191#0#0#0#0'IEND'#174'B`'#130 +]); +LazarusResources.Add('quickfix12x12','PNG',[ + #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#12#0#0#0#12#8#6#0#0#0'Vu\'#231#0#0 + +#0#1'sRGB'#0#174#206#28#233#0#0#0#6'bKGD'#0#255#0#255#0#255#160#189#167#147#0 + +#0#0#9'pHYs'#0#0#11#19#0#0#11#19#1#0#154#156#24#0#0#0#7'tIME'#7#217#4#16#8#3 + +#18#138#251'e+'#0#0#1#141'IDAT('#207#133#142#191'O'#19'a'#28#135#159#187'^R[' + +#139#191'R'#175#134#19#6#23'cj'#226#1'n'#14#232'T7F;'#178#168#169#147#245'O0' + +'qpjb'#28#24#24'tf'#147#137'8i@c'#12#162'u0'#181#12#180'5m'#207#250'^'#129 + +#203'!pw'#239#215#205#128#196#240#204#207''''#159#199#224#31#194#149')'#11'8' + +#7#209'&"%'#224#171'$'#219'J'#208#140'Lw'#2#139#163'X'#144#220'E'#199#158'a' + +#141#204' '#251#139':'#138'.'#128#188#2'>'#31#25#156#188#177#186#27'.'#23#3 + +'3W|j'#164#243#25#189#231'M'#242#187#253#29#225#25#128'q(g'#249#234#4':zbd' + +#198'o'#249'2yb+Lci'#159#139#185#181'$'#222#250#240#26#137#239#155#7#7':'#25 + +#214'E'#7#243'K'#31#141#161#175']'#156#137'G'#236'D9'#140#180#19#19#199'_HP' + +#135#147#146'}w'#225#253#216#131#149#245#252#249#155#167#18'~z/'#185'tv'#155 + +#248#215#155#8#205'('#194#153#212'A'#191#17#220#190#179#161#236#202#143#174 + +'g'#174#173#190#219#155#26#251#182'S'#204'j'#179#235#175#19'G'#247'N'#207 + +#208#251#251'P.'#151'g'#179#217'l'#173#211#233#160#148#194#206#180#31'O'#143 + +#15'/'#235#128#5#132'Q'#17#242'@'#223#2'('#149'J'#179#182'm'#215#26#141#6#158 + +#231#161#148#170#190#157#27'>'#151#132#235#192#134#8'>'#144#2'0*'#149#202'C' + +#211'4k'#205'f'#147'~'#191#191#217#235#245#170#131#193#224#5#255#193't'#28 + +#167#230#186'.a'#24'r'#156#12#144'*'#20#10#215#234#245#250#149'n'#183'[m'#181 + +'Zs'#28#195#31'2B'#189#242#195'u'#215#179#0#0#0#0'IEND'#174'B`'#130 +]); LazarusResources.Add('state_circular_reference','PNG',[ #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#0#16#8#4#0#0#0#181#250'7' +#234#0#0#0#4'gAMA'#0#0#175#200'7'#5#138#233#0#0#0#25'tEXtSoftware'#0'Adobe I' diff --git a/images/laz_images_list.txt b/images/laz_images_list.txt index 6e9cb881a1..b582e28ffa 100644 --- a/images/laz_images_list.txt +++ b/images/laz_images_list.txt @@ -110,6 +110,13 @@ menu/menu_view_todo.png menu/menu_view_toggle_form_unit.png menu/menu_view_units.png menu/menu_view_unit_info.png +states/state12x12_error.png +states/state12x12_fatal.png +states/state12x12_hint.png +states/state12x12_information.png +states/state12x12_note.png +states/state12x12_warning.png +states/quickfix12x12.png states/state_circular_reference.png states/state_error.png states/state_fatal.png @@ -216,4 +223,4 @@ codetoolsdefines/da_ifdef.png codetoolsdefines/da_ifndef.png codetoolsdefines/da_undefine.png codetoolsdefines/da_undefineall.png -codetoolsdefines/da_undefinerecurse.png \ No newline at end of file +codetoolsdefines/da_undefinerecurse.png diff --git a/images/states/quickfix12x12.png b/images/states/quickfix12x12.png new file mode 100644 index 0000000000000000000000000000000000000000..308940af61df31356c4cdeecdb5268bbc554fbe1 GIT binary patch literal 525 zcmV+o0`mQdP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ= z2m=y|`(-Nt00E6jL_t(2&xMY^PZMDrho8G%Qd^6^Qm=*+1{Y&$;sI_B=u|gGJF=*$ zll4z9ad2v492gjMW|N6HX+UEPqIEE}474?E&-z}0%OP-g@7K+M#PH0|C!fdQAHtO> z3pfYSCL$%^t0db>(2PuX0*j+qklaPbo?(s5Ap46tiY|b>0zMxZoV>BR8!i_EGgo|S zr1KfQ=S}jv{T<;MfN>~i`RW8ZdSYb8Z}~ELVk=BzX`hR^wIts9@EVEln+FFv8P-Jy z^GhF%p|4$>iAU^2IgGRu6USdjP=}L}eRtvg*n^ez{P~-w5`KCwxpa1$_}7~V%_zc| z)Iq-y+`hA+?8=X>XRfWj+nXBuwo}Z1YP0LF6G!(>&(Qn(P%f8ev)OE|)9Ij;!p^iG zPmd2T>wpD>Q4#V$-vTI=O0%|Y*BXrmp68*Is=l2YK9_{+z=jAukOD9&mC8fYG;7Uf zlYYOy+3WSHgTdeh|G{(|r{=mYVHk3p43H`m3fJoO`ju|CTWz&ka~#7TGD5xb!*$oQ P00000NkvXXu0mjfVngO- literal 0 HcmV?d00001 diff --git a/images/states/state12x12_error.png b/images/states/state12x12_error.png new file mode 100644 index 0000000000000000000000000000000000000000..b55f001fba5d3b3d341543359ca6bfe48c886abd GIT binary patch literal 604 zcmV-i0;BzjP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4HYC;XuwAR00G=dL_t(2&y9}FOH@$+N6)?QjpmH=;n;}Dgi(eNjH|#!n*s+7hq6U2 zk`~n_cdhydY}>L$OWXG?geVdefr}y#l0w5W21jQ^-@G^TKJL4>h1t5_@^B9P00 z@V~Qz*?ah|`w#dJrYoc~Q(DR%75L4lQGcF){OXMWvwf#5#F1!b@Ad@|Ps8H_<5s>0 z**ZWcv-sOJ!k_C)aoCzJK6$$%kAilf=hWcY@s2{?NZ-}g$c0$8n{jHO-z0`hV^L)0 ze$9;85}hMEn9Jf)&8(7lKEb&;+Y9&+nJOAD%E|>?kk`- zzZ;E(F^5leY*4YpUt6QAzliQiO&tc1ml&dY-DqQ@n%-exEMg@HYP*P7|Mh^-^&Ax$ zNaj$!LhbG0fBHzYe}HNQi0&LJHUzHgNC2-^edcU#Vx1h4QL{yCC+RGmN3}yDKcsVL zn8uH9cssQh0^l-;M>j7nWJX5I>0AMSV}m%>0317Yn#S&Lw%#u+y52#>0$2xb4`vp; z>efi8#ZY3Ph)8x}vRP{DU#YIVTk@Rxtt+4FjsRG#ltgKM)hu2r+8wH6($4f;H3>Tx qwOVewzVp)6!TgOc`{CPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4IL(Nzbj(^00HGmL_t(2&vlMFYg1tWK+k>TOPcm-HBFlm#l^wNK`p*O#JRt~MMoz= z5C;()x++*oL1!n0*2PVwMHECSh)7YSO{`#YlbYV#=a=t3J}0|**295Ay1i(m+lwau zA$`qh0Ikm(#XB(m3AOd;ie(zt%&Oj?QoQ`Mdi&4G+2Xoway(DzY0dM>Jm2>Ny|cI+ z#rch{S2Cv@l@8qvJ(j!`^~qzX{x+HF+)dJnrTvxPyYy@e^Tk>}d$wMbYW9|>AD)0{ zwh*C1NpY!mHIx>>%{vdKKYr;vJUUaF3c}cUy7Hb;<&<%R4>;MTF-%MrUe%pj_i8IP zK(m(3M^W{}!sE|cCb5w!#qQ8#_3Io5jUD>I0e;2fGaYZ|vJEg8cxR{UQ;b)uI*AkG z;)OYeQOee!K_LaMS5Pe*jG5s%8(=u}4wcJ-Mx&vd%_e($dxT*~5`_feh(g6kT}F=7 zqz&Nv{-$l)L{Vf&DarF3DJ4mgkR&mAUZAByDfP_+=yW=3-EJ4HwHX9~_B;>Y_X&c4 zI8Lx_n_jPn@B8Z(K)c=kX<61Ra7GAWNGVCvlswN7LeTH`X|-BUwARa(<2Wd#5JJ3h zT{p_IY({G>Mx#+lN*TMZ`=i}%FBL^`A4vZKhZ7FD%C;y900000NkvXXu0mjf#fJ~m literal 0 HcmV?d00001 diff --git a/images/states/state12x12_hint.png b/images/states/state12x12_hint.png new file mode 100644 index 0000000000000000000000000000000000000000..f68853927c5d8774e5c1842d58370276d1dc9c2d GIT binary patch literal 552 zcmV+@0@wYCP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4IT?0O(fL-00F2;L_t(2&yA5yNK|1IhM(`dGa^noLuusX7%hs%P2jFTa1}JQl^JMN zK|~P*)g~-bWbR4>i7*jb)P)F&en1EMQEO3&JB6HrT4)X77+#u5XT0;B7USHaTJ*w! z!})p7IqxB9XGqx@#eX1`&Oj>tSF!aE^Whh#>`Wrov}rgTs*4#BPi^G1R@V2`^_34_ z+>7^n5~Dur`H@#&R|+K&5%EOCGa}`RNU0*?{_v#Fd24o`xE&1u5Wl)L)*RXv4%P8- z$wOZ1|ZwJyqGU8yTvkl zwg=eRWD#z#D3+lm5*?&?BK0ckssoSXfW?|Sntw|QnhSBSSZ2IJ9smH*~) zcVeEYx!md3*Seoqwe=AX0<@oW4&NM`m3vd!QZhaMu=B!$eE_|8rZ-eQIKytC*hF>~6j^5f|qv~^}HEoxE`=VW)bbRnxW8(7Tj#|9Ce=K-x;Hd&QHT2?- q*W16=b0)IZktPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4IVV9D+%ZT00HbtL_t(2&yA4HOVeQh$3M@rjX9l8e@^EMLv%L7C^9>Vmjp|2p%f1yJif}l%vE+V2=sEZ`g!QKu=q|MaIuvyM+x;I_Fm*@9%a_2tBFQ4z_1Hi#)|_|17%=2O*S=-Q`5vtLX)%4xD)Ra!6XJej{d^&GBhFYF}T+li$`k4B|u|9 zo`|>9@ikS@+O@H4n;+>i71P93CJU=M`g_8(_?eUdPQ^5Y)NF27v}u`uVxY$$=#yBc z!&Y${FB*@w3<+RbX326jrc<%nx=up>aXL|#)$rRaKnNYyXzP=99**tGv zeSGH`ey!s@aW$D-U#t%BjIoZ3yUdc-+rFXEdM^UzH+-L0D{9eM0w_- zZf?EgZ9WtoZ)x&Rc(EECSC?~}rDvtZZ!gwX?^>;W7sNkNiQwl-5gEz=0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4IdnZg^*JK00DnVL_t(2&y|tSY7W7Nhie+8l)nE?XDno*+-}gH^t)0O&`Rq zOYtH40xq5(PyqvA_YSPS)bu-09$5JvtCXaz$tR5gjUG)7LXD(g?P~To5&j5zNdRZh>9otlXR8XVhKpG^BvAqqFE0QG0m~Yk8piI$pZa~m5 zLBb62Ll*Kb8cISv4=4~O-{7J}EKWecQ zU*6N|Z_--XqIG?ntiOTAsg0M%eZG(F?(9@%X}KML3{se!(eAHdvPHBhQ7NrIedlMd z>)xNIPafUOhflt8?E!=ioIM6NZ)||IyKsA7-7oc5^4n)$H$4CV002ovPDHLkV1g-8 B(%}FA literal 0 HcmV?d00001 diff --git a/images/states/state12x12_warning.png b/images/states/state12x12_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..10b517b1fbf2028d4332fafe9b088fef5dc3f33d GIT binary patch literal 592 zcmV-W0Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXJ< z4Ieuok0m$&00GcRL_t(2&vlPaNRx3G$3O3H%Rggn29c8_qs8hl+w8A_2wj38NXl3q zf`U#_&?TZ%hfdM0BC|^|NMs$dgVTd_u{;!-gdLXA+SJ;#t!2};_x-)^)1g8;_<`s0 ze4p?4%L8jz9POa+D&|_d`!;q)u^#h72LV_ZiL~UCktg}#NB|%=6kXr+C-vmW(uW6< zA3Yui5D^35bARjVQEvEv0+{W09WA}PDIy|;*HKZm;TV+EkFKl1v)K=e~rfUE$fSJ2Qy`i4_zTIarzuZw^f>BS6$H35O<=J+E^4CIp zSIyL*0`TlOcEcMwk5zo?h|Zv^KQWhbD3=Dih_&#L#zQgu;nwT!^y7x{x