This commit is contained in:
Basile Burg 2015-09-14 04:38:34 +02:00
parent 44b48164ae
commit cf0d62f0b7
1 changed files with 47 additions and 45 deletions

View File

@ -79,6 +79,7 @@ type
procedure ListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure ListKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private private
fDemangle: boolean; fDemangle: boolean;
fDemanglerAvailable: boolean;
fMsgColors: array[TCEAppMessageKind] of TColor; fMsgColors: array[TCEAppMessageKind] of TColor;
fActAutoSel: TAction; fActAutoSel: TAction;
fActClearAll: TAction; fActClearAll: TAction;
@ -117,7 +118,7 @@ type
function iconIndex(aKind: TCEAppMessageKind): Integer; function iconIndex(aKind: TCEAppMessageKind): Integer;
procedure handleMessageClick(Sender: TObject); procedure handleMessageClick(Sender: TObject);
procedure callDemangler; procedure callDemangler;
procedure freeMangler; procedure freeDemangler;
// //
procedure setColorError(aValue: TColor); procedure setColorError(aValue: TColor);
procedure setColorInfo(aValue: TColor); procedure setColorInfo(aValue: TColor);
@ -325,6 +326,7 @@ begin
// //
fToDemangle := TStringList.Create; fToDemangle := TStringList.Create;
fToDemangleObjs:= TFPList.Create; fToDemangleObjs:= TFPList.Create;
fDemanglerAvailable := exeInSysPath('ddemangle' + exeExt);
// //
EntitiesConnector.addObserver(self); EntitiesConnector.addObserver(self);
EntitiesConnector.addSingleService(self); EntitiesConnector.addSingleService(self);
@ -334,7 +336,7 @@ destructor TCEMessagesWidget.destroy;
begin begin
fToDemangle.Free; fToDemangle.Free;
fToDemangleObjs.Free; fToDemangleObjs.Free;
freeMangler; freeDemangler;
fOptions.saveToFile(getCoeditDocPath + optname); fOptions.saveToFile(getCoeditDocPath + optname);
EntitiesConnector.removeObserver(self); EntitiesConnector.removeObserver(self);
inherited; inherited;
@ -683,20 +685,6 @@ begin
exit('ICEMessagesDisplay'); exit('ICEMessagesDisplay');
end; end;
procedure TCEMessagesWidget.demanglerOutput(sender: TObject);
var
itm: TTreeNode;
i: integer;
begin
fToDemangle.LoadFromStream(fDemangler.OutputStack);
for i := 0 to fToDemangleObjs.Count -1 do
begin
itm := TTreeNode(fToDemangleObjs.Items[i]);
if itm = nil then continue;
itm.Text := fToDemangle.Strings[i];
end;
end;
procedure TCEMessagesWidget.message(const aValue: string; aData: Pointer; procedure TCEMessagesWidget.message(const aValue: string; aData: Pointer;
aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind); aCtxt: TCEAppMessageCtxt; aKind: TCEAppMessageKind);
var var
@ -772,47 +760,61 @@ var
i: integer; i: integer;
str: string; str: string;
begin begin
freeMangler; if not fDemanglerAvailable then
exit;
//
freeDemangler;
fDemangler := TCEProcess.Create(nil); fDemangler := TCEProcess.Create(nil);
fDemangler.Executable := 'ddemangle' + exeExt; fDemangler.Executable := 'ddemangle' + exeExt;
fDemangler.OnTerminate:= @demanglerOutput; fDemangler.OnTerminate:= @demanglerOutput;
fDemangler.Options:= fDemangler.Options + [poUsePipes]; fDemangler.Options:= fDemangler.Options + [poUsePipes];
fDemangler.ShowWindow:= swoHIDE; fDemangler.ShowWindow:= swoHIDE;
if exeInSysPath(fDemangler.Executable) then fToDemangle.Clear;
fToDemangleObjs.Clear;
for i := 0 to list.Items.Count-1 do
begin begin
fToDemangle.Clear; dat := PMessageData(list.Items.Item[i].Data);
fToDemangleObjs.Clear; if dat^.demangled then continue;
for i := 0 to list.Items.Count-1 do dat^.demangled := true;
str := list.Items.Item[i].Text;
fToDemangleObjs.add(list.Items.Item[i]);
fToDemangle.Add(str);
end;
if fToDemangle.Count > 0 then
begin
fDemangler.Execute;
for i := 0 to fToDemangle.Count-1 do
begin begin
dat := PMessageData(list.Items.Item[i].Data); str := fToDemangle.Strings[i] + LineEnding;
if dat^.demangled then continue; fDemangler.Input.Write(str[1], length(str));
dat^.demangled := true;
str := list.Items.Item[i].Text;
fToDemangleObjs.add(list.Items.Item[i]);
fToDemangle.Add(str);
end;
if fToDemangle.Count > 0 then
begin
fDemangler.Execute;
for i := 0 to fToDemangle.Count-1 do
begin
str := fToDemangle.Strings[i] + LineEnding;
fDemangler.Input.Write(str[1], length(str));
end;
fDemangler.CloseInput;
end; end;
fDemangler.CloseInput;
end; end;
end; end;
procedure TCEMessagesWidget.freeMangler; procedure TCEMessagesWidget.demanglerOutput(sender: TObject);
var
itm: TTreeNode;
i: integer;
begin begin
if fDemangler <> nil then fToDemangle.LoadFromStream(fDemangler.OutputStack);
begin for i := 0 to fToDemangleObjs.Count -1 do
if fDemangler.Active then begin
fDemangler.Terminate(0); itm := TTreeNode(fToDemangleObjs.Items[i]);
fDemangler.Free; if itm = nil then continue;
fDemangler := nil; itm.Text := fToDemangle.Strings[i];
end; end;
end;
procedure TCEMessagesWidget.freeDemangler;
begin
if fDemangler = nil then
exit;
//
if fDemangler.Active then
fDemangler.Terminate(0);
fDemangler.Free;
fDemangler := nil;
end; end;
procedure TCEMessagesWidget.updateLoop; procedure TCEMessagesWidget.updateLoop;