6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 ComCtrls, ToolWin, StdCtrls, ExtCtrls, SsParser, BottleDef, Menus,
8 Clipbrd, Logs, ShellAPI, Commctrl, DirectSstp;
11 TSaveLogType = (stLog, stLogWithChannels, stText, stXML);
13 TfrmLog = class(TForm)
15 tbtnClear: TToolButton;
18 StatusBar: TStatusBar;
19 tbtnSaveLog: TToolButton;
20 PopupMenuPreview: TPopupMenu;
22 tbtnVoteMessage: TToolButton;
23 PopupMenuListView: TPopupMenu;
24 mnPopUpVoteMessage: TMenuItem;
25 SaveDialog: TSaveDialog;
30 mnPopUpCopyScript: TMenuItem;
31 PopupMenuSaveLog: TPopupMenu;
33 mnSaveLogChannel: TMenuItem;
34 mnSaveLogScript: TMenuItem;
35 mnSaveLogXML: TMenuItem;
36 ToolButton1: TToolButton;
38 mnPopUpAgreeMessage: TMenuItem;
39 tbtnAgreeMessage: TToolButton;
40 ToolButton2: TToolButton;
41 tbtnPreviewStyle: TToolButton;
42 PopupMenuPreviewStyle: TPopupMenu;
43 mnPreviewStyleConversation: TMenuItem;
44 mnPreviewStyleScript: TMenuItem;
45 mnPreviewStyleScriptWithLineBreak: TMenuItem;
46 procedure tbtnClearClick(Sender: TObject);
47 procedure FormCreate(Sender: TObject);
48 procedure lvwLogChange(Sender: TObject; Item: TListItem;
50 procedure lvwLogDblClick(Sender: TObject);
51 procedure lvwLogKeyPress(Sender: TObject; var Key: Char);
52 procedure FormDestroy(Sender: TObject);
53 procedure lvwLogClick(Sender: TObject);
54 procedure mnSaveLogClick(Sender: TObject);
55 procedure lvwLogColumnClick(Sender: TObject; Column: TListColumn);
56 procedure mnPopUpCopyScriptClick(Sender: TObject);
57 procedure mnSaveLogChannelClick(Sender: TObject);
58 procedure mnSaveLogScriptClick(Sender: TObject);
59 procedure mnSaveLogXMLClick(Sender: TObject);
60 procedure lvwLogData(Sender: TObject; Item: TListItem);
61 procedure PopupMenuListViewPopup(Sender: TObject);
62 procedure lvwLogCustomDrawItem(Sender: TCustomListView;
63 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
64 procedure lvwLogCustomDrawSubItem(Sender: TCustomListView;
65 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
66 var DefaultDraw: Boolean);
67 procedure PopupMenuPreviewStylePopup(Sender: TObject);
68 procedure mnPreviewStyleClick(Sender: TObject);
69 procedure tbtnPreviewStyleClick(Sender: TObject);
72 SortColumn: integer; //
\97ñ
\83N
\83\8a\83b
\83N
\83\
\81[
\83g
\97p
73 SortDesc: boolean; //
\97ñ
\83N
\83\8a\83b
\83N
\83\
\81[
\83g
\97p
74 FLastScript: String; //
\83X
\83N
\83\8a\83v
\83g
\8dÄ
\95`
\89æ
\97}
\90§
\97p
75 procedure UpdateScript(const Script: String);
76 procedure UpdateScriptConversationColor(const Script: String);
77 procedure UpdateScriptConversationNoColor(const Script: String);
78 procedure UpdateScriptScript(const Script: String);
79 procedure DoSaveLog(SaveType: TSaveLogType; Ext: String;
81 procedure mnURLClick(Sender: TObject);
82 procedure ExtractURLs(Script: String; Result: TStrings);
83 function XmlEntity(S: String): String;
85 procedure CreateParams(var Params: TCreateParams); override;
88 procedure AddScriptLog(const Script, Channel, MID, Ghost: String);
89 procedure AddSystemLog(const MessageString: String);
90 procedure SetBottleStatusToPlaying(const MID: String);
91 procedure SetBottleStatusToOpened(const MID: String);
92 procedure UpdateWindow;
93 procedure SelAndFocusMessage(const MID: String);
118 procedure TfrmLog.AddScriptLog(const Script, Channel, MID, Ghost: String);
119 var LogItem: TLogItem;
122 lvwLog.OnChange := nil; //
\83C
\83x
\83\93\83g
\94
\90¶(
\82¢
\82ë
\82¢
\82ë
\8dÄ
\95`
\89æ
\82ª
\8bN
\82«
\82é)
\82Ì
\97}
\90§
123 if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
124 LogItem := TLogItem.Create(ltBottle, MID, Channel, Script, Ghost, Now());
125 BottleLog.Insert(0, LogItem);
126 lvwLog.Items.Count := BottleLog.Count;
128 if Sel >= 0 then begin
129 lvwLog.Selected := lvwLog.Items[Sel + 1];
130 lvwLog.Selected.Focused := true;
132 if not lvwLog.Focused then
133 ListView_Scroll(lvwLog.Handle, 0, High(integer));
134 lvwLog.OnChange := lvwLogChange;
137 procedure TfrmLog.AddSystemLog(const MessageString: String);
138 var LogItem: TLogItem;
141 lvwLog.OnChange := nil;
142 if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
143 LogItem := TLogItem.Create(ltSystemLog, '', '', MessageString, '', Now());
144 BottleLog.Insert(0, LogItem);
145 lvwLog.Items.Count := BottleLog.Count;
147 if Sel >= 0 then begin
148 lvwLog.Selected := lvwLog.Items[Sel + 1];
149 lvwLog.Selected.Focused := true;
151 if not lvwLog.Focused then
152 ListView_Scroll(lvwLog.Handle, 0, High(integer));
153 lvwLog.OnChange := lvwLogChange;
156 procedure TfrmLog.tbtnClearClick(Sender: TObject);
159 lvwLog.Items.Count := 0;
161 lvwLogChange(Self, nil, ctState);
164 procedure TfrmLog.FormCreate(Sender: TObject);
166 SsParser.TagPattern.Assign(frmSender.SsParser.TagPattern);
167 SsParser.MetaPattern.Assign(frmSender.SsParser.MetaPattern);
169 with Pref.LogWindowPosition do begin
172 Self.Width := Right - Left + 1;
173 Self.Height := Bottom - Top + 1;
175 lvwLog.DoubleBuffered := true;
176 edtScript.Height := Pref.LogWindowDividerPos;
177 UpdateWindow; // Reset window color and enabled status of some buttons
180 procedure TfrmLog.FormDestroy(Sender: TObject);
182 with Pref.LogWindowPosition do begin
185 Right := Self.Left + Self.Width - 1;
186 Bottom := Self.Top + Self.Height - 1;
188 Pref.LogWindowDividerPos := edtScript.Height;
191 procedure TfrmLog.lvwLogChange(Sender: TObject; Item: TListItem;
192 Change: TItemChange);
196 StatusBar.Panels[0].Text := IntToStr(lvwLog.Items.Count) + '
\8c\8f';
197 if Change = ctState then begin
199 if lvwLog.Selected <> nil then begin
200 Log := BottleLog.Bottles[lvwLog.Selected.Index];
201 if Log.LogType = ltBottle then begin
202 Script := Log.Script;
203 frmSender.actVoteMessage.Enabled := true;
204 frmSender.actAgreeMessage.Enabled := true;
205 mnPopUpCopyScript.Enabled := true;
206 UpdateScript(Script);
208 frmSender.actVoteMessage.Enabled := false;
209 frmSender.actAgreeMessage.Enabled := false;
210 mnPopUpCopyScript.Enabled := false;
211 UpdateScript(''); //
\83\8d\83O
\83v
\83\8c\83r
\83\85\81[
\95\94\82ð
\83N
\83\8a\83A
214 frmSender.actVoteMessage.Enabled := false;
215 frmSender.actAgreeMessage.Enabled := false;
216 mnPopUpCopyScript.Enabled := false;
217 UpdateScript(Script); //
\83\8d\83O
\83v
\83\8c\83r
\83\85\81[
\95\94\83N
\83\8a\83A
220 tbtnSaveLog.Enabled := lvwLog.Items.Count > 0;
223 procedure TfrmLog.lvwLogDblClick(Sender: TObject);
225 Opt: TScriptTransOptions;
226 SOpt: TSstpSendOptions;
230 if lvwLog.Selected = nil then Exit;
231 //Log := TLogItem(lvwLog.Selected.Data);
232 Log := BottleLog.Bottles[lvwLog.Selected.Index];
233 if Log = nil then Exit;
234 if Log.LogType <> ltBottle then Exit;
235 Script := Log.Script;
236 Opt := [toConvertURL, toWaitScriptEnd];
237 if Pref.NoTransUrl then Opt := Opt + [toNoChoice];
238 if Pref.IgnoreFrequentYenS then Opt := Opt + [toIgnoreFrequentYenS];
239 if Pref.FixMessySurface then Opt := Opt + [toFixMessySurface];
240 frmSender.DoTrans(Script, Opt);
242 Ghost := frmSender.GetChannelPrefs(Log.Channel).TargetGhost;
243 if Ghost = '' then //
\83`
\83\83\83\93\83l
\83\8b\8ew
\92è
\83S
\81[
\83X
\83g
244 if frmSender.ChannelList.Channel[Log.Channel] <> nil then
245 Ghost := frmSender.ChannelList.Channel[Log.Channel].Ghost;
246 //
\96Ú
\95W
\83S
\81[
\83X
\83g
\8c\88\92è
247 if Log.Ghost <> '' then Ghost := Log.Ghost;
248 if frmSender.GetChannelPrefs(Log.Channel).IgnoreIfGhost then
249 Ghost := frmSender.GetChannelPrefs(Log.Channel).TargetGhost;
250 //
\83^
\81[
\83Q
\83b
\83g
\83S
\81[
\83X
\83g
\8am
\92è
251 Ghost := frmSender.SetHWndToFavoriteGhost(Ghost);
252 frmSender.DirectSstp.SstpSender := 'SSTP Bottle -
\81y
\83\8d\83O
\8dÄ
\90¶
\81z';
253 if Pref.NoTranslate then SOpt := [soNoTranslate] else SOpt := [];
254 frmSender.DirectSstp.SstpSEND(Script, SOpt, frmSender.GhostNameToSetName(Ghost));
257 procedure TfrmLog.UpdateScriptConversationColor(const Script: String);
260 UnyuTalking, Talked: boolean;
263 frmSender.DoTrans(scr, [toConvertURL]);
264 SsParser.LeaveEscape := false;
265 SsParser.InputString := scr;
266 SsParser.LeaveEscape := true;
267 UnyuTalking := false;
268 Talked := false; //'\h\u\h\u'
\82Ì
\82æ
\82¤
\82È
\83X
\83N
\83\8a\83v
\83g
\82Å
\8bó
\82«
\8ds
\82ð
\8dì
\82ç
\82È
\82¢
\82½
\82ß
\82Ì
\91[
\92u
269 edtScript.Text := '';
270 edtScript.Color := Pref.BgColor;
271 for i := 0 to SsParser.Count-1 do begin
272 if (SsParser[i] = '\u') and not UnyuTalking then begin
275 edtScript.SelText := #13#10;
279 if (SsParser[i] = '\h') and UnyuTalking then begin
280 UnyuTalking := false;
282 edtScript.SelText := #13#10;
286 if SsParser.MarkUpType[i] = mtStr then begin
288 edtScript.SelAttributes.Color := Pref.TalkColorU
290 edtScript.SelAttributes.Color := Pref.TalkColorH;
291 edtScript.SelText := SsParser[i];
294 if SsParser.MarkUpType[i] = mtMeta then begin
295 edtScript.SelAttributes.Color := Pref.MetaWordColor;
296 edtScript.SelText := SsParser[i];
302 procedure TfrmLog.UpdateScriptConversationNoColor(const Script: String);
305 UnyuTalking, Talked, LastUnyuTalked: boolean;
308 frmSender.DoTrans(Scr, [toConvertURL]);
309 SsParser.LeaveEscape := false;
310 SsParser.InputString := Scr;
311 SsParser.LeaveEscape := true;
312 edtScript.Text := '';
313 edtScript.Color := clWindow;
314 edtScript.DefAttributes.Color := clWindowText;
315 edtScript.SelAttributes.Color := clWindowText;
317 UnyuTalking := false;
318 LastUnyuTalked := false;
319 for i := 0 to SsParser.Count-1 do begin
320 if (SsParser[i] = '\u') and not UnyuTalking then begin
323 if (SsParser[i] = '\h') and UnyuTalking then begin
324 UnyuTalking := false;
326 if SsParser.MarkUpType[i] in [mtStr, mtMeta] then begin
327 if not Talked then begin
328 if UnyuTalking then Scr := '
\82¤:' else Scr := '
\82³:';
330 if Talked and (UnyuTalking <> LastUnyuTalked) then begin
332 if UnyuTalking then Scr := Scr + '
\82¤:' else Scr := Scr + '
\82³:';
334 Scr := Scr + SsParser[i];
336 LastUnyuTalked := UnyuTalking;
339 edtScript.Text := Scr;
342 procedure TfrmLog.lvwLogKeyPress(Sender: TObject; var Key: Char);
344 if Key = #13 then lvwLogDblClick(Sender);
347 procedure TfrmLog.CreateParams(var Params: TCreateParams);
350 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
353 procedure TfrmLog.lvwLogClick(Sender: TObject);
355 //
\89E
\83N
\83\8a\83b
\83N
\82Å
\83\81\83j
\83\85\81[
\8fo
\82·
\82Æ
\82«
\82É
\94
\90¶
\82·
\82é
\95s
\8bï
\8d\87\91Î
\8dô
357 Selected := Selected;
360 procedure TfrmLog.mnSaveLogClick(Sender: TObject);
362 DoSaveLog(stLog, 'log', 1);
365 procedure TfrmLog.lvwLogColumnClick(Sender: TObject; Column: TListColumn);
366 var SortType: TBottleLogSortType;
369 if lvwLog.Selected <> nil then
370 SelectedMID := BottleLog.Bottles[lvwLog.Selected.Index].MID;
371 if SortColumn = Column.Index then
372 SortDesc := not SortDesc
374 SortColumn := Column.Index;
378 -1: SortType := stLogTime;
379 subChannel: SortType := stChannel;
380 subVotes: SortType := stVote;
381 subAgrees: SortType := stAgree;
382 subScript: SortType := stScript;
383 else SortType := stLogTime;
385 BottleLog.SortBottles(SortType, SortDesc);
387 SelAndFocusMessage(SelectedMID);
391 procedure TfrmLog.mnPopUpCopyScriptClick(Sender: TObject);
396 Log := BottleLog.Bottles[frmLog.lvwLog.Selected.Index];
397 if Log = nil then Exit;
399 Clip.SetTextBuf(PChar(Log.Script));
402 procedure TfrmLog.SetBottleStatusToOpened(const MID: String);
404 if BottleLog.Bottle(MID) <> nil then begin
405 BottleLog.Bottle(MID).State := lsOpened;
406 lvwLog.OnChange := nil;
408 lvwLog.OnChange := lvwLogChange;
412 procedure TfrmLog.SetBottleStatusToPlaying(const MID: String);
414 if BottleLog.Bottle(MID) <> nil then begin
415 BottleLog.Bottle(MID).State := lsPlaying;
416 lvwLog.OnChange := nil;
418 lvwLog.OnChange := lvwLogChange;
422 procedure TfrmLog.DoSaveLog(SaveType: TSaveLogType; Ext: String; Filter: integer);
428 DayStr: array[1..7] of String = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
430 SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
431 SaveDialog.DefaultExt := Ext;
432 SaveDialog.FilterIndex := Filter;
433 if SaveDialog.Execute then begin
436 Log := TStringList.Create;
438 stLog, stLogWithChannels: begin
439 for i := 0 to BottleLog.Count -1 do begin
440 LogItem := BottleLog.Bottles[i];
441 if LogItem = nil then Continue;
442 if LogItem.LogType <> ltBottle then Continue;
443 Date := FormatDateTime('yyyy/mm/dd hh:nn:ss ', LogItem.LogTime);
444 Date := Date + '(' + DayStr[DayOfWeek(LogItem.LogTime)] + ')';
445 if SaveType = stLogWithChannels then
446 Date := Date + ',' + LogItem.Channel +',SEND,' + LogItem.Script
448 Date := Date + ',0.0.0.0,SEND,' + LogItem.Script;
453 for i := 0 to BottleLog.Count -1 do begin
454 LogItem := BottleLog.Bottles[i];
455 if LogItem = nil then Continue;
456 if LogItem.LogType <> ltBottle then Continue;
457 Log.Add(LogItem.Script);
461 Log.Add('<?xml version=''1.0'' encoding=''Shift_JIS''?>');
462 Log.Add('<bottlelog>');
463 for i := 0 to BottleLog.Count -1 do begin
464 LogItem := BottleLog.Bottles[i];
465 if LogItem = nil then Continue;
466 if LogItem.LogType <> ltBottle then Continue;
467 Date := FormatDateTime('yyyy/mm/dd hh:nn:ss', LogItem.LogTime);
468 Log.Add(Format('<message mid=''%s''>', [LogItem.MID]));
469 Log.Add('<date>' + Date + '</date>');
470 Log.Add('<channel>' + XmlEntity(LogItem.Channel) + '</channel>');
472 Log.Add('<script>' + XmlEntity(LogItem.Script) + '</script>');
474 if LogItem.Ghost = '' then
477 Log.Add(Format('<ghost>%s</ghost>', [XmlEntity(LogItem.Ghost)]));
479 Log.Add('</message>');
481 Log.Add('</bottlelog>');
484 Log.SaveToFile(SaveDialog.FileName);
491 procedure TfrmLog.mnSaveLogChannelClick(Sender: TObject);
493 DoSaveLog(stLogWithChannels, 'log', 1);
496 procedure TfrmLog.mnSaveLogScriptClick(Sender: TObject);
498 DoSaveLog(stText, 'txt', 2);
501 procedure TfrmLog.mnSaveLogXMLClick(Sender: TObject);
503 DoSaveLog(stXML, 'xml', 3);
506 procedure TfrmLog.lvwLogData(Sender: TObject; Item: TListItem);
511 Log := BottleLog.Bottles[i];
513 Caption := FormatDateTime('yy/mm/dd hh:nn:ss', Log.LogTime);
515 if Log.Ghost <> '' then
516 SubItems.Add(Log.Channel + '/' + Log.Ghost)
518 SubItems.Add(Log.Channel);
519 if Log.LogType = ltBottle then begin
520 SubItems.Add(IntToStr(Log.Votes));
521 SubItems.Add(IntToStr(Log.Agrees));
523 //
\83V
\83X
\83e
\83\80\83\8d\83O
\82È
\82Ç
\82Í
\93\8a\95[
\81E
\93¯
\88Ó
\82ð
\95\
\8e¦
\82µ
\82È
\82¢
527 SubItems.Add(Log.Script);
529 if Log.LogType = ltBottle then begin
531 lsUnopened: ImageIndex := IconBottle;
532 lsPlaying: ImageIndex := IconPlaying;
533 lsOpened: ImageIndex := IconOpened;
536 ImageIndex := IconSystemLog;
540 procedure TfrmLog.UpdateWindow;
542 if Pref.ColorScript then begin
543 if lvwLog.Color <> Pref.BgColor then lvwLog.Color := Pref.BgColor;
544 if lvwLog.Font.Color <> Pref.TalkColorH then lvwLog.Font.Color := Pref.TalkColorH;
546 if lvwLog.Color <> clWindow then lvwLog.Color := clWindow;
547 if lvwLog.Font.Color <> clWindowText then lvwLog.Font.Color := clWindowText;
549 lvwLog.Items.Count := BottleLog.Count;
551 //lvwLogChange(Self, lvwLog.Selected, ctState);
554 procedure TfrmLog.PopupMenuListViewPopup(Sender: TObject);
560 for i := 0 to mnJumpURL.Count-1 do begin
561 mnJumpURL.Items[i].Free;
563 mnJumpURL.Enabled := false;
564 if lvwLog.Selected = nil then Exit;
565 Log := BottleLog.Bottles[lvwLog.Selected.Index];
566 if Log = nil then Exit;
569 Urls := TStringList.Create;
570 ExtractURLs(Log.Script, Urls);
571 for i := 0 to Urls.Count-1 do begin
572 Child := TMenuItem.Create(Self);
574 Caption := Format('(&%d) %s', [i+1, Urls[i]]);
575 OnClick := mnURLClick;
576 AutoHotkeys := maManual;
577 mnJumpURL.Add(Child);
580 mnJumpURL.Enabled := Urls.Count > 0;
586 procedure TfrmLog.mnURLClick(Sender: TObject);
589 URL := (Sender as TMenuItem).Caption;
590 RegExp.Subst('s/^\(&?\d\) //', URL);
591 ShellExecute(Handle, 'open', PChar(URL), nil, nil, SW_SHOW);
594 procedure TfrmLog.ExtractURLs(Script: String; Result: TStrings);
595 var i, u, j: integer;
599 SsParser.LeaveEscape := false;
600 SsParser.InputString := Script;
601 SsParser.LeaveEscape := true;
602 for i := 0 to SsParser.Count-1 do begin
603 if (SsParser.Match(SsParser[i], '\URL%b') > 0) then begin
604 for u := 7 downto 1 do begin
605 if (SsParser.Match(SsParser[i],
606 '\URL%b'+StringReplace(StringOfChar('-', u*2),
607 '-', '%b', [rfReplaceAll]))) > 0 then begin
608 for j := 1 to u do begin
609 s := SsParser.GetParam(SsParser[i], j*2);
610 if Pos('http://', s) > 0 then Result.Add(s);
615 if SsParser.Match(SsParser[i], '\URL%b%b') = 0 then begin //
\8aÈ
\88Õ
\94ÅURL
\95Ï
\8a·
616 //
\8aÈ
\88Õ
\8c`
\8e®\URL
\83^
\83O
\95Ï
\8a·
617 s := SsParser.GetParam(SsParser[i], 1);
618 if Pos('http://', s) > 0 then Result.Add(s);
624 procedure TfrmLog.SelAndFocusMessage(const MID: String);
628 for i := 0 to BottleLog.Count-1 do begin
629 Log := BottleLog.Items[i] as TLogItem;
630 if Log.MID = MID then begin
631 lvwLog.Items[i].Selected := true;
632 lvwLog.Items[i].Focused := true;
637 procedure TfrmLog.lvwLogCustomDrawItem(Sender: TCustomListView;
638 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
643 procedure TfrmLog.lvwLogCustomDrawSubItem(Sender: TCustomListView;
644 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
645 var DefaultDraw: Boolean);
651 Mark: TSsMarkUpType;}
654 {if (SubItem <> SubScript+1) or (not Pref.ColorScript) then Exit; // DefaultDraw = true
655 // Custom Script Coloring
656 DefaultDraw := false;
657 SavedDC := SaveDC(lvwLog.Canvas.Handle);
659 ListView_GetSubItemRect(lvwLog.Handle, Item.Index, SubScript+1, LVIR_BOUNDS, @DestRect);
661 lvwLog.Canvas.Brush.Style := bsSolid;
662 if cdsSelected in State then begin
663 lvwLog.Canvas.Brush.Color := clHighlight
665 lvwLog.Canvas.Brush.Color := Pref.BgColor;
667 lvwLog.Canvas.FillRect(DestRect);
668 lvwLog.Canvas.Brush.Style := bsClear;
670 Script := Item.SubItems[SubScript];
671 // DrawTextEx(lvwLog.Canvas.Handle, PChar(Script), -1, DestRect, DT_END_ELLIPSIS, nil);
672 SsParser.InputString := Script;
674 for i := 0 to SsParser.Count - 1 do begin
675 Mark := SsParser.MarkUpType[i];
677 mtMeta: lvwLog.Canvas.Font.Color := Pref.MetaWordColor;
678 mtTag: lvwLog.Canvas.Font.Color := Pref.MarkUpColor;
679 mtTagErr: lvwLog.Canvas.Font.Color := Pref.MarkErrorColor;
681 lvwLog.Canvas.Font.Color := Pref.TalkColorH;
684 w := lvwLog.Canvas.TextWidth(SsParser[i]);
685 lvwLog.Canvas.TextRect(DestRect, DestRect.Left + x, DestRect.Top + 2, SsParser[i]);
687 if DestRect.Right - DestRect.Left < x then Break;
690 RestoreDC(lvwLog.Canvas.Handle, SavedDC);
694 procedure TfrmLog.UpdateScript(const Script: String);
696 if Script <> FLastScript then begin
697 if Pref.LogWindowPreviewStyle = psConversation then begin
698 if Pref.ColorScript then begin
699 UpdateScriptConversationColor(Script);
701 UpdateScriptConversationNoColor(Script);
704 UpdateScriptScript(Script);
706 SendMessage(edtScript.Handle, EM_LINESCROLL, Low(integer), Low(integer)); //
\83X
\83N
\83\8d\81[
\83\8b\96ß
\82µ
707 FLastScript := Script;
711 procedure TfrmLog.PopupMenuPreviewStylePopup(Sender: TObject);
714 with PopupMenuPreviewStyle do
715 for i := 0 to Items.Count-1 do
716 Items[i].Checked := Items[i].Tag = Ord(Pref.LogWindowPreviewStyle)
719 procedure TfrmLog.mnPreviewStyleClick(Sender: TObject);
722 with PopupMenuPreviewStyle do
723 for i := 0 to Items.Count-1 do
724 Items[i].Checked := (Sender as TMenuItem).Tag = Items[i].Tag;
725 Pref.LogWindowPreviewStyle := TLogWindowPreviewStyle((Sender as TMenuItem).Tag);
727 lvwLogChange(self, lvwLog.Selected, ctState);
730 procedure TfrmLog.UpdateScriptScript(const Script: String);
732 UnyuTalking: boolean;
735 if Pref.ColorScript then begin
736 edtScript.Color := Pref.BgColor;
738 edtScript.Color := clWindow;
739 edtScript.DefAttributes.Color := clWindowText;
740 edtScript.SelAttributes.Color := clWindowText;
742 SsParser.LeaveEscape := true;
743 SsParser.InputString := Script;
744 edtScript.Text := '';
745 edtScript.SelAttributes.Color := clWindowText;
746 UnyuTalking := false;
747 for i := 0 to SsParser.Count-1 do begin
748 if Pref.ColorScript then begin
749 case SsParser.MarkUpType[i] of
752 edtScript.SelAttributes.Color := Pref.TalkColorU
754 edtScript.SelAttributes.Color := Pref.TalkColorH;
757 edtScript.SelAttributes.Color := Pref.MarkUpColor;
758 if SsParser[i] = '\h' then
760 else if SsParser[i] = '\u' then
763 mtMeta: edtScript.SelAttributes.Color := Pref.MetaWordColor;
764 mtTagErr: edtScript.SelAttributes.Color := Pref.MarkErrorColor;
767 edtScript.SelText := SsParser[i];
768 if (SsParser[i] = '\n') and (Pref.LogWindowPreviewStyle = psScriptWithLineBreak) then
769 edtScript.SelText := #13#10;
773 procedure TfrmLog.tbtnPreviewStyleClick(Sender: TObject);
776 sel := Ord(Pref.LogWindowPreviewStyle);
778 if sel > Ord(High(TLogWindowPreviewStyle)) then sel := 0;
779 Pref.LogWindowPreviewStyle := TLogWindowPreviewStyle(sel);
781 lvwLogChange(self, lvwLog.Selected, ctState);
784 function TfrmLog.XmlEntity(S: String): String;
786 S := StringReplace(S, '&', '&', [rfReplaceAll]);
787 S := StringReplace(S, '<', '<', [rfReplaceAll]);
788 S := StringReplace(S, '>', '>', [rfReplaceAll]);