6 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
7 ComCtrls, ToolWin, StdCtrls, ExtCtrls, SsParser, BottleDef, Menus,
8 Clipbrd, Logs, ShellAPI, Commctrl, DirectSstp, Contnrs, StrUtils,
9 TalkShowFrame, SppList, HtmlOutputConfig, HtmlOutputProgress,
10 SearchLog, IniFiles, BRegExp, RegexUtils;
13 //
\83\8d\83O
\82Ì
\95Û
\91¶
\95û
\96@
14 TSaveLogType = (stLog, stLogWithChannels, stText, stXML);
16 //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\83X
\83N
\83\8d\81[
\83\8b\95û
\8cü
17 TLVScrollDir = (lvScrollUp, lvScrollDown);
19 TfrmLog = class(TForm)
21 tbtnClear: TToolButton;
24 StatusBar: TStatusBar;
25 tbtnSaveLog: TToolButton;
26 PopupMenuPreview: TPopupMenu;
28 tbtnVoteMessage: TToolButton;
29 PopupMenuListView: TPopupMenu;
30 mnPopUpVoteMessage: TMenuItem;
31 SaveDialog: TSaveDialog;
34 mnPopUpCopyScript: TMenuItem;
35 PopupMenuSaveLog: TPopupMenu;
37 mnSaveLogChannel: TMenuItem;
38 mnSaveLogScript: TMenuItem;
39 mnSaveLogXML: TMenuItem;
40 ToolButton1: TToolButton;
42 mnPopUpAgreeMessage: TMenuItem;
43 tbtnAgreeMessage: TToolButton;
44 ToolButton2: TToolButton;
45 tbtnPreviewStyle: TToolButton;
46 PopupMenuPreviewStyle: TPopupMenu;
47 mnPreviewStyleConversation: TMenuItem;
48 mnPreviewStyleScript: TMenuItem;
49 mnPreviewStyleScriptWithLineBreak: TMenuItem;
51 tabBottleLog: TTabControl;
53 tbtnDownloadLog: TToolButton;
54 PopupMenuTab: TPopupMenu;
55 mnCloseTab: TMenuItem;
56 tbtnFindBottle: TToolButton;
57 tbtnOpenLog: TToolButton;
58 OpenDialog: TOpenDialog;
59 tbtnInsertCue: TToolButton;
60 mnInsertCue: TMenuItem;
61 PopupMenuListPreviewStyle: TPopupMenu;
62 mnListPreviewStyleNormal: TMenuItem;
63 mnListPreviewStyleTagStripped: TMenuItem;
64 tbtnListPreviewStyle: TToolButton;
65 mnListPreviewStyleNoColor: TMenuItem;
66 SsParserForTalkShow: TSsParser;
67 mnPreviewStyleConversationImage: TMenuItem;
68 pnlPreviewArea: TPanel;
69 TalkShowFrame: TfrmTalkShow;
71 tbtnSendEditor: TToolButton;
72 mnSendEditor: TMenuItem;
73 timScrollTimer: TTimer;
74 mnChangeTabName: TMenuItem;
77 mnDeleteLogItem: TMenuItem;
78 mnTabSaveXMLLog: TMenuItem;
79 mnSaveHTML: TMenuItem;
80 mnPopupCopyGhost: TMenuItem;
81 PopupMenuAction: TPopupMenu;
82 mnTestAction: TMenuItem;
83 mnSelAction: TMenuItem;
84 mnAllAction: TMenuItem;
85 procedure tbtnClearClick(Sender: TObject);
86 procedure FormCreate(Sender: TObject);
87 procedure lvwLogChange(Sender: TObject; Item: TListItem;
89 procedure lvwLogDblClick(Sender: TObject);
90 procedure lvwLogKeyPress(Sender: TObject; var Key: Char);
91 procedure FormDestroy(Sender: TObject);
92 procedure lvwLogClick(Sender: TObject);
93 procedure mnSaveLogClick(Sender: TObject);
94 procedure lvwLogColumnClick(Sender: TObject; Column: TListColumn);
95 procedure mnPopUpCopyScriptClick(Sender: TObject);
96 procedure mnSaveLogChannelClick(Sender: TObject);
97 procedure mnSaveLogScriptClick(Sender: TObject);
98 procedure mnSaveLogXMLClick(Sender: TObject);
99 procedure lvwLogData(Sender: TObject; Item: TListItem);
100 procedure PopupMenuListViewPopup(Sender: TObject);
101 procedure lvwLogCustomDrawItem(Sender: TCustomListView;
102 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
103 procedure PopupMenuPreviewStylePopup(Sender: TObject);
104 procedure mnPreviewStyleClick(Sender: TObject);
105 procedure tbtnPreviewStyleClick(Sender: TObject);
106 procedure tabBottleLogChange(Sender: TObject);
107 procedure tabBottleLogChanging(Sender: TObject;
108 var AllowChange: Boolean);
109 procedure tabBottleLogContextPopup(Sender: TObject; MousePos: TPoint;
110 var Handled: Boolean);
111 procedure mnCloseTabClick(Sender: TObject);
112 procedure tbtnFindBottleClick(Sender: TObject);
113 procedure tbtnOpenLogClick(Sender: TObject);
114 procedure tabBottleLogMouseDown(Sender: TObject; Button: TMouseButton;
115 Shift: TShiftState; X, Y: Integer);
116 procedure tabBottleLogDragOver(Sender, Source: TObject; X, Y: Integer;
117 State: TDragState; var Accept: Boolean);
118 procedure tabBottleLogDragDrop(Sender, Source: TObject; X, Y: Integer);
119 procedure tabBottleLogEndDrag(Sender, Target: TObject; X, Y: Integer);
120 procedure lvwLogDrawItem(Sender: TCustomListView; Item: TListItem;
121 Rect: TRect; State: TOwnerDrawState);
122 procedure mnListPreviewStyleClick(Sender: TObject);
123 procedure tbtnListPreviewStyleClick(Sender: TObject);
124 procedure PopupMenuListPreviewStylePopup(Sender: TObject);
125 procedure lvwLogDragOver(Sender, Source: TObject; X, Y: Integer;
126 State: TDragState; var Accept: Boolean);
127 procedure lvwLogDragDrop(Sender, Source: TObject; X, Y: Integer);
128 procedure timScrollTimerTimer(Sender: TObject);
129 procedure mnChangeTabNameClick(Sender: TObject);
130 procedure lvwLogStartDrag(Sender: TObject;
131 var DragObject: TDragObject);
132 procedure lvwLogEndDrag(Sender, Target: TObject; X, Y: Integer);
133 procedure mnTabSaveXMLLogClick(Sender: TObject);
134 procedure mnSaveHTMLClick(Sender: TObject);
135 procedure mnPopupCopyGhostClick(Sender: TObject);
136 procedure mnTestActionClick(Sender: TObject);
137 procedure mnSelActionClick(Sender: TObject);
138 procedure mnAllActionClick(Sender: TObject);
141 FLastScript: String; //
\83X
\83N
\83\8a\83v
\83g
\8dÄ
\95`
\89æ
\97}
\90§
\97p
142 FBottleLogList: TObjectList;
144 FDragTabIndex: integer; //
\83^
\83u
\83h
\83\89\83b
\83O
\83h
\83\8d\83b
\83v
\8aÖ
\98A
145 FDragTabDest: integer; //
\83h
\83\8d\83b
\83v
\82·
\82é
\88Ê
\92u(
\82·
\82®
\89E
\82É
\82
\82é
\83^
\83u
\82Ì
\83C
\83\93\83f
\83b
\83N
\83X)
147 //
\83\8a\83X
\83g
\83r
\83\85\81[
\83h
\83\89\83b
\83O
\83h
\83\8d\83b
\83v
\8aÖ
\98A
148 FLVScrollDir: TLVScrollDir; //
\83X
\83N
\83\8d\81[
\83\8b\95û
\8cü
149 FLVDragDest: integer; //
\83h
\83\8d\83b
\83v
\82·
\82é
\88Ê
\92u(
\82·
\82®
\89º
\82É
\82
\82é
\83A
\83C
\83e
\83\80\82ÌIndex)
151 procedure UpdateScript(const Script: String);
152 procedure UpdateScriptConversationColor(const Script: String);
153 procedure UpdateScriptScript(const Script: String);
154 procedure mnURLClick(Sender: TObject);
155 procedure ExtractURLs(Script: String; Result: TStrings);
156 function GetDefaultFileName(const Name: String; const Ext: String): String;
157 function BottleLogTitled(const LogName: String): TBottleLogList;
158 procedure DrawSingleLineScript(LogItem: TLogItem; Rect: TRect;
160 procedure PreviewStyleChange;
161 procedure DrawListViewDragBorder(const Rect: TRect);
162 function DoSaveLogXML(Log: TBottleLogList): integer;
163 procedure DoCloseTab(const Index: integer);
164 function DoSearchLog(Condition: TSearchCond): TBottleLogList;
165 procedure SearchLogIndivisual(Condition: TSearchCond;
166 LogList, Result: TBottleLogList; UntilIndex: integer = -1);
167 function CheckLogSave(const Index: integer): integer;
169 procedure CreateParams(var Params: TCreateParams); override;
172 function SelectedBottleLog: TBottleLogList;
173 property BottleLogList: TObjectList read FBottleLogList;
174 procedure AddCurrentScriptLog(const LogName, Script, Channel, MID, Ghost: String;
175 const LogTime: TDateTime; const Vote, Agree: integer);
176 procedure AddCurrentSystemLog(const LogName, MessageString: String);
177 procedure VoteLog(const MID: String; const Vote: integer);
178 procedure AgreeLog(const MID: String; const Agree: integer);
179 procedure SetBottleState(const MID: String; State: TLogState);
180 procedure AllBottleOpened;
181 procedure LogLoaded(Sender: TObject);
182 procedure LogLoadFailure(Sender: TObject; const Message: String);
183 procedure LogLoadWork(Sender: TObject);
184 procedure HTMLOutputWork(Sender: TObject; const Count: integer;
185 var Canceled: boolean);
187 procedure UpdateWindow;
188 procedure SelAndFocusMessage(const MID: String);
189 function CheckLog(Sender: TObject): integer;
192 TBottleLogDragObject = class(TDragControlObjectEx)
194 FBottleLogList: TBottleLogList;
196 procedure SetBottleLogList(const Value: TBottleLogList);
197 procedure SetLogItem(const Value: TLogItem);
199 function GetDragImages: TDragImageList; override;
201 property BottleLogList: TBottleLogList read FBottleLogList write SetBottleLogList;
202 property LogItem: TLogItem read FLogItem write SetLogItem;
228 procedure TfrmLog.AddCurrentScriptLog(const LogName, Script, Channel, MID, Ghost: String;
229 const LogTime: TDateTime; const Vote, Agree: integer);
232 BottleLogTitled(LogName).AddScriptLog(Script, Channel, MID, Ghost, LogTime, Vote, Agree);
233 BottleLogTitled(LogName).LogModified := true; //
\82±
\82Ì
\83\8a\83X
\83g
\82Í
\95Ï
\8dX
\82³
\82ê
\82½
234 if SelectedBottleLog <> BottleLogTitled(LogName) then Exit;
235 lvwLog.OnChange := nil; //
\83C
\83x
\83\93\83g
\94
\90¶(
\82¢
\82ë
\82¢
\82ë
\8dÄ
\95`
\89æ
\82ª
\8bN
\82«
\82é)
\82Ì
\97}
\90§
236 if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
237 lvwLog.Items.Count := SelectedBottleLog.Count;
239 if Sel >= 0 then begin
240 lvwLog.Selected := lvwLog.Items[Sel + 1];
241 lvwLog.Selected.Focused := true;
243 if not lvwLog.Focused then
244 ListView_Scroll(lvwLog.Handle, 0, High(integer));
245 lvwLog.OnChange := lvwLogChange;
248 procedure TfrmLog.AddCurrentSystemLog(const LogName, MessageString: String);
251 BottleLogTitled(LogName).AddSystemLog(MessageString);
252 if SelectedBottleLog <> BottleLogTitled(LogName) then Exit;
253 lvwLog.OnChange := nil;
254 if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
255 lvwLog.Items.Count := SelectedBottleLog.Count;
257 if Sel >= 0 then begin
258 lvwLog.Selected := lvwLog.Items[Sel + 1];
259 lvwLog.Selected.Focused := true;
261 if not lvwLog.Focused then
262 ListView_Scroll(lvwLog.Handle, 0, High(integer));
263 lvwLog.OnChange := lvwLogChange;
268 procedure TfrmLog.tbtnClearClick(Sender: TObject);
270 if SelectedBottleLog = nil then Exit;
271 DoCloseTab(tabBottleLog.TabIndex);
274 procedure TfrmLog.FormCreate(Sender: TObject);
277 FLVDragDest := -1; //
\83\8a\83X
\83g
\83r
\83\85\81[
\82Ì
\83h
\83\89\83b
\83O
\92\86\82Å
\82Í
\82È
\82¢
278 FBottleLogList := TObjectList.Create;
280 SsParser.TagPattern.Assign(frmSender.SsParser.TagPattern);
281 SsParser.MetaPattern.Assign(frmSender.SsParser.MetaPattern);
283 with Pref.LogWindowPosition do begin
286 Self.Width := Right - Left + 1;
287 Self.Height := Bottom - Top + 1;
289 lvwLog.DoubleBuffered := true;
290 pnlPreviewArea.Height := Pref.LogWindowDividerPos;
293 while Token(Pref.LogWindowColumnWidth, ',', i) <> '' do begin
294 lvwLog.Columns[i].Width := StrToIntDef(Token(Pref.LogWindowColumnWidth, ',', i), 100);
298 SsParserForTalkShow.TagPattern.Assign(SsParser.TagPattern);
299 SsParserForTalkShow.MetaPattern.Assign(SsParser.MetaPattern);
300 SsParserForTalkShow.EscapeInvalidMeta := false;
301 SsParserForTalkShow.LeaveEscape := false;
302 TalkShowFrame.SsParser := self.SsParserForTalkShow;
304 TalkShowFrame.SetPreviewFont(edtScript.Font);
305 TalkShowFrame.PrevControl := lvwLog;
307 mnSelAction.Checked := Pref.LogAction; //
\8f\89\8aú
\89»
310 UpdateWindow; // Reset window color and enabled status of some buttons
313 procedure TfrmLog.FormDestroy(Sender: TObject);
318 for i := 0 to lvwLog.Columns.Count-1 do begin
319 if i > 0 then WidthStr := WidthStr + ',';
320 WidthStr := WidthStr + IntToStr(lvwLog.Column[i].Width);
322 Pref.LogWindowColumnWidth := WidthStr;
324 with Pref.LogWindowPosition do begin
327 Right := Self.Left + Self.Width - 1;
328 Bottom := Self.Top + Self.Height - 1;
330 Pref.LogWindowDividerPos := pnlPreviewArea.Height;
332 FreeAndNil(FBottleLogList);
335 procedure TfrmLog.lvwLogChange(Sender: TObject; Item: TListItem;
336 Change: TItemChange);
337 var Script, Text: String;
339 Selected, IsNormalBottle: boolean;
342 IsNormalBottle := false;
343 if SelectedBottleLog <> nil then begin
344 if Change = ctState then begin
346 if lvwLog.Selected <> nil then begin
348 StatusBar.Panels[0].Text := Format('%d/%d
\8c\8f', [lvwLog.Selected.Index+1,
349 SelectedBottleLog.Count]);
350 Log := SelectedBottleLog.Bottles[lvwLog.Selected.Index];
351 // if (Log.LogType = ltBottle) and not frmSender.Connecting then begin
352 if Log.LogType = ltBottle then begin
353 IsNormalBottle := true;
354 Script := Log.Script;
355 Text := Format('%d
\83o
\83C
\83g/%d
\95b -
\83_
\83u
\83\8b\83N
\83\8a\83b
\83N
\82Å
\8dÄ
\90¶',
356 [Length(Log.Script), frmSender.SsPlayTime.PlayTime(Log.Script) div 1000]);
357 StatusBar.Panels[1].Text := Text;
358 if Pref.LogWindowPreviewStyle = psImageConversation then
359 TalkShowFrame.View(Log)
361 UpdateScript(Script);
363 StatusBar.Panels[1].Text := '';
364 UpdateScript(''); //
\83\8d\83O
\83v
\83\8c\83r
\83\85\81[
\95\94\82ð
\83N
\83\8a\83A
367 StatusBar.Panels[0].Text := IntToStr(SelectedBottleLog.Count) + '
\8c\8f';
368 StatusBar.Panels[1].Text := '';
369 UpdateScript(Script); //
\83\8d\83O
\83v
\83\8c\83r
\83\85\81[
\95\94\83N
\83\8a\83A
372 tbtnSaveLog.Enabled := lvwLog.Items.Count > 0;
374 StatusBar.Panels[0].Text := '';
375 UpdateScript(''); //
\83\8d\83O
\83v
\83\8c\83r
\83\85\81[
\95\94\83N
\83\8a\83A
377 frmSender.actVoteMessage.Enabled := Selected and IsNormalBottle;
378 frmSender.actAgreeMessage.Enabled := Selected and IsNormalBottle;
379 frmSender.actSendToEditor.Enabled := Selected and IsNormalBottle;
380 frmSender.actInsertCue.Enabled := Selected;
381 frmSender.actDeleteLogItem.Enabled := Selected;
382 mnPopUpCopyScript.Enabled := Selected and IsNormalBottle;
383 mnPopupCopyGhost.Enabled := Selected and IsNormalBottle;
386 procedure TfrmLog.lvwLogDblClick(Sender: TObject);
387 var Script, ErrorMes: String;
388 Log, CueItem: TLogItem;
391 if lvwLog.Selected = nil then
393 Log := SelectedBottleLog.Bottles[lvwLog.Selected.Index];
394 if Log = nil then Exit;
395 if Log.LogType <> ltBottle then
397 //
\92P
\91Ì
\83A
\83N
\83V
\83\87\83\93\82ª
\97L
\8cø
\82Å
\82 \82ê
\82Î
\83X
\83N
\83\8a\83v
\83g
\82Ì
\95Ï
\8a·
\82µ
\82È
\82¢
398 if Pref.LogAction then
400 Script := Log.Script;
403 Script := frmSender.ScriptTransForSSTP(Log.Script, ErrorMes);
405 if ErrorMes <> '' then
407 Res := MessageDlg('
\96â
\91è
\82Ì
\82 \82é
\83X
\83N
\83\8a\83v
\83g
\82Å
\82·
\81B
\8dÄ
\90¶
\82Å
\82«
\82Ü
\82¹
\82ñ
\81B'#13#10+
409 '
\8b
\90§
\93I
\82É
\8dÄ
\90¶
\82µ
\82Ü
\82·
\82©?'#13#10,
410 mtWarning, mbOkCancel, 0
412 if Res = mrCancel then
416 CueItem := TLogItem.Create(Log);
418 //
\83A
\83N
\83V
\83\87\83\93\82ª
\97L
\8cø
\82Å
\82 \82ê
\82Î
\92Ê
\8fí
\8f\88\97\9d\8fÈ
\97ª
419 if Pref.LogAction then
420 //
\8c^
\95Ï
\8a·
\82Æ
\8eó
\90M
421 frmSender.BottleCnv(CueItem)
424 //
\83`
\83\83\83\93\83l
\83\8b\83S
\81[
\83X
\83g
\91Î
\8dô
425 if CueItem.Ghost = '' then
426 if ChannelList.Channel[CueItem.Channel] <> nil then
427 CueItem.Ghost := ChannelList.Channel[CueItem.Channel].Ghost;
428 CueItem.Script := Script;
429 frmSender.BottleSstp.Unshift(CueItem);
436 procedure TfrmLog.UpdateScriptConversationColor(const Script: String);
439 UnyuTalking, Talked, InSynchronized: boolean;
442 frmSender.DoTrans(scr, [toConvertURL]);
443 SsParser.LeaveEscape := false;
444 SsParser.InputString := scr;
445 UnyuTalking := false;
446 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
447 InSynchronized := false;
448 edtScript.Text := '';
449 edtScript.Color := Pref.BgColor;
450 for i := 0 to SsParser.Count-1 do begin
451 if (SsParser[i] = '\_s') and not InSynchronized then begin
452 InSynchronized := true;
454 edtScript.SelText := #13#10;
457 end else if (SsParser[i] = '\_s') and InSynchronized then begin
458 InSynchronized := false;
460 edtScript.SelText := #13#10;
464 if (SsParser[i] = '\u') and not UnyuTalking then begin
467 edtScript.SelText := #13#10;
471 if (SsParser[i] = '\h') and UnyuTalking then begin
472 UnyuTalking := false;
474 edtScript.SelText := #13#10;
478 if SsParser.MarkUpType[i] = mtStr then begin
479 if InSynchronized then
480 edtScript.SelAttributes.Color := Pref.TalkColorS
481 else if UnyuTalking then
482 edtScript.SelAttributes.Color := Pref.TalkColorU
484 edtScript.SelAttributes.Color := Pref.TalkColorH;
485 edtScript.SelText := SsParser[i];
488 if SsParser.MarkUpType[i] = mtMeta then begin
489 edtScript.SelAttributes.Color := Pref.MetaWordColor;
490 edtScript.SelText := SsParser[i];
496 procedure TfrmLog.lvwLogKeyPress(Sender: TObject; var Key: Char);
498 if Key = #13 then lvwLogDblClick(Sender);
501 procedure TfrmLog.CreateParams(var Params: TCreateParams);
504 Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
507 procedure TfrmLog.lvwLogClick(Sender: TObject);
509 //
\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ô
511 Selected := Selected;
514 procedure TfrmLog.lvwLogColumnClick(Sender: TObject; Column: TListColumn);
515 var SortType: TBottleLogSortType;
519 if SelectedBottleLog = nil then
521 if lvwLog.Selected <> nil then
522 SelectedMID := SelectedBottleLog.Bottles[lvwLog.Selected.Index].MID
526 SortColumn := Column.Index;
528 -1: SortType := stLogTime;
529 subChannel: SortType := stChannel;
530 subGhost: SortType := stGhost;
531 subVotes: SortType := stVote;
532 subAgrees: SortType := stAgree;
533 subScript: SortType := stScript;
535 SortType := stLogTime;
538 SelectedBottleLog.SortBottles(SortType);
540 if Length(SelectedMID) > 0 then
541 SelAndFocusMessage(SelectedMID);
545 procedure TfrmLog.mnPopUpCopyScriptClick(Sender: TObject);
550 Log := SelectedBottleLog.Bottles[frmLog.lvwLog.Selected.Index];
551 if Log = nil then Exit;
553 Clip.SetTextBuf(PChar(Log.Script));
556 procedure TfrmLog.SetBottleState(const MID: String; State: TLogState);
560 for i := 0 to FBottleLogList.Count-1 do begin
561 Bottle := (FBottleLogList[i] as TBottleLogList).Bottle(MID);
562 if Bottle <> nil then begin
563 Bottle.State := State;
564 lvwLog.OnChange := nil;
566 lvwLog.OnChange := lvwLogChange;
571 procedure TfrmLog.mnSaveLogClick(Sender: TObject);
573 if SelectedBottleLog = nil then Exit;
574 SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.log');
575 SaveDialog.InitialDir := Pref.LogDir;
576 SaveDialog.DefaultExt := 'log';
577 SaveDialog.FilterIndex := 1;
578 if SaveDialog.Execute then
579 SelectedBottleLog.SaveToSstpLog(SaveDialog.FileName, false);
582 procedure TfrmLog.mnSaveLogChannelClick(Sender: TObject);
584 if SelectedBottleLog = nil then Exit;
585 SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.log');
586 SaveDialog.InitialDir := Pref.LogDir;
587 SaveDialog.DefaultExt := 'log';
588 SaveDialog.FilterIndex := 1;
589 if SaveDialog.Execute then
590 SelectedBottleLog.SaveToSstpLog(SaveDialog.FileName, true);
593 procedure TfrmLog.mnSaveLogScriptClick(Sender: TObject);
595 if SelectedBottleLog = nil then Exit;
596 SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.txt');
597 SaveDialog.InitialDir := Pref.LogDir;
598 SaveDialog.DefaultExt := 'txt';
599 SaveDialog.FilterIndex := 2;
600 if SaveDialog.Execute then
601 SelectedBottleLog.SaveToText(SaveDialog.FileName);
604 procedure TfrmLog.mnSaveLogXMLClick(Sender: TObject);
606 if SelectedBottleLog = nil then Exit;
607 DoSaveLogXML(SelectedBottleLog);
610 procedure TfrmLog.lvwLogData(Sender: TObject; Item: TListItem);
614 if Item = nil then Exit;
616 Log := SelectedBottleLog.Bottles[i];
618 Caption := FormatDateTime('yy/mm/dd hh:nn:ss', Log.LogTime);
620 SubItems.Add(Log.Channel);
621 SubItems.Add(Log.Ghost);
622 if Log.LogType = ltBottle then begin
623 if Log.Votes > 0 then
624 SubItems.Add(IntToStr(Log.Votes))
627 if Log.Agrees > 0 then
628 SubItems.Add(IntToStr(Log.Agrees))
632 //
\83V
\83X
\83e
\83\80\83\8d\83O
\82È
\82Ç
\82Í
\93\8a\95[
\81E
\93¯
\88Ó
\82ð
\95\
\8e¦
\82µ
\82È
\82¢
636 SubItems.Add(Log.Script);
638 if Log.LogType = ltBottle then begin
640 lsUnopened: ImageIndex := IconBottle;
641 lsPlaying: ImageIndex := IconPlaying;
642 lsOpened: ImageIndex := IconOpened;
645 ImageIndex := IconSystemLog;
649 procedure TfrmLog.UpdateWindow;
650 var EnabledFlag: boolean;
652 lvwLog.Color := Pref.BgColor;
653 lvwLog.Font.Color := Pref.TextColor;
654 if SelectedBottleLog <> nil then begin
655 Caption := '
\83\8d\83O - ' + SelectedBottleLog.Title;
656 StatusBar.Panels[0].Text := IntToStr(SelectedBottleLog.Count) + '
\8c\8f';
657 lvwLog.Items.Count := SelectedBottleLog.Count;
659 Caption := '
\83\8d\83O';
660 StatusBar.Panels[0].Text := '';
661 StatusBar.Panels[1].Text := '';
662 lvwLog.Items.Count := 0;
665 EnabledFlag := SelectedBottleLog <> nil;
666 tbtnClear.Enabled := EnabledFlag;
667 tbtnSaveLog.Enabled := EnabledFlag;
668 tbtnFindBottle.Enabled := EnabledFlag;
673 procedure TfrmLog.PopupMenuListViewPopup(Sender: TObject);
679 for i := mnJumpURL.Count-1 downto 0 do begin
680 mnJumpURL.Items[i].Free;
682 mnJumpURL.Enabled := false;
683 if lvwLog.Selected = nil then Exit;
684 Log := SelectedBottleLog.Bottles[lvwLog.Selected.Index];
685 if Log = nil then Exit;
686 Urls := TStringList.Create;
688 ExtractURLs(Log.Script, Urls);
689 for i := 0 to Urls.Count-1 do begin
690 Child := TMenuItem.Create(Self);
692 Caption := Format('(&%d) %s', [i+1, StringReplace(Urls[i], '&', '&&', [rfReplaceAll])]);
694 OnClick := mnURLClick;
695 AutoHotkeys := maManual;
696 mnJumpURL.Add(Child);
699 mnJumpURL.Enabled := Urls.Count > 0;
705 procedure TfrmLog.mnURLClick(Sender: TObject);
706 var LogItem: TLogItem;
710 if (lvwLog.Selected = nil) or (SelectedBottleLog = nil) then Exit;
711 LogItem := SelectedBottleLog[lvwLog.Selected.Index] as TLogItem;
712 Urls := TStringList.Create;
714 ExtractURLs(LogItem.Script, Urls);
715 URL := Urls[(Sender as TMenuItem).Tag];
716 frmSender.OpenBrowser(URL);
722 procedure TfrmLog.ExtractURLs(Script: String; Result: TStrings);
723 var i, u, j: integer;
727 SsParser.InputString := Script;
728 SsParser.LeaveEscape := true;
729 for i := 0 to SsParser.Count-1 do begin
730 if (SsParser.Match(SsParser[i], '\URL%b') > 0)
731 and (SsParser.MarkUpType[i] = mtTag) then
733 for u := 7 downto 1 do begin
734 if (SsParser.Match(SsParser[i],
735 '\URL%b'+StringReplace(StringOfChar('-', u*2),
736 '-', '%b', [rfReplaceAll]))) > 0 then begin
737 for j := 1 to u do begin
738 s := SsParser.GetParam(SsParser[i], j*2);
739 if Pos('http://', s) > 0 then Result.Add(s);
744 if SsParser.Match(SsParser[i], '\URL%b%b') = 0 then begin //
\8aÈ
\88Õ
\94ÅURL
\95Ï
\8a·
745 //
\8aÈ
\88Õ
\8c`
\8e®\URL
\83^
\83O
\95Ï
\8a·
746 s := SsParser.GetParam(SsParser[i], 1);
747 if Pos('http://', s) > 0 then Result.Add(s);
753 procedure TfrmLog.SelAndFocusMessage(const MID: String);
757 for i := 0 to SelectedBottleLog.Count-1 do begin
758 Log := SelectedBottleLog.Items[i] as TLogItem;
759 if Log.MID = MID then begin
760 lvwLog.Items[i].Selected := true;
761 lvwLog.Items[i].Focused := true;
766 procedure TfrmLog.lvwLogCustomDrawItem(Sender: TCustomListView;
767 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
772 procedure TfrmLog.UpdateScript(const Script: String);
774 if Script <> FLastScript then begin
775 if Pref.LogWindowPreviewStyle = psConversation then begin
776 UpdateScriptConversationColor(Script);
778 UpdateScriptScript(Script);
780 SendMessage(edtScript.Handle, EM_LINESCROLL, Low(integer), Low(integer)); //
\83X
\83N
\83\8d\81[
\83\8b\96ß
\82µ
781 FLastScript := Script;
785 procedure TfrmLog.PopupMenuPreviewStylePopup(Sender: TObject);
788 with PopupMenuPreviewStyle do
789 for i := 0 to Items.Count-1 do
790 Items[i].Checked := Items[i].Tag = Ord(Pref.LogWindowPreviewStyle)
793 procedure TfrmLog.mnPreviewStyleClick(Sender: TObject);
796 with PopupMenuPreviewStyle do
797 for i := 0 to Items.Count-1 do
798 Items[i].Checked := (Sender as TMenuItem).Tag = Items[i].Tag;
799 Pref.LogWindowPreviewStyle := TLogWindowPreviewStyle((Sender as TMenuItem).Tag);
802 lvwLogChange(self, lvwLog.Selected, ctState);
805 procedure TfrmLog.UpdateScriptScript(const Script: String);
807 UnyuTalking, InSynchronized: boolean;
810 edtScript.Color := Pref.BgColor;
811 SsParser.LeaveEscape := true;
812 SsParser.InputString := Script;
813 edtScript.Text := '';
814 edtScript.SelAttributes.Color := clWindowText;
815 UnyuTalking := false;
816 InSynchronized := false;
817 for i := 0 to SsParser.Count-1 do begin
818 case SsParser.MarkUpType[i] of
820 if InSynchronized then
821 edtScript.SelAttributes.Color := Pref.TalkColorS
822 else if UnyuTalking then
823 edtScript.SelAttributes.Color := Pref.TalkColorU
825 edtScript.SelAttributes.Color := Pref.TalkColorH;
828 edtScript.SelAttributes.Color := Pref.MarkUpColor;
829 if SsParser[i] = '\h' then
831 else if SsParser[i] = '\u' then
833 else if SsParser[i] = '\_s' then
834 InSynchronized := not InSynchronized;
836 mtMeta: edtScript.SelAttributes.Color := Pref.MetaWordColor;
837 mtTagErr: edtScript.SelAttributes.Color := Pref.MarkErrorColor;
839 edtScript.SelText := SsParser[i];
840 if (SsParser[i] = '\n') and (Pref.LogWindowPreviewStyle = psScriptWithLineBreak) then
841 edtScript.SelText := #13#10;
845 procedure TfrmLog.tbtnPreviewStyleClick(Sender: TObject);
848 sel := Ord(Pref.LogWindowPreviewStyle);
850 if sel > Ord(High(TLogWindowPreviewStyle)) then sel := 0;
851 Pref.LogWindowPreviewStyle := TLogWindowPreviewStyle(sel);
854 lvwLogChange(self, lvwLog.Selected, ctState);
857 function TfrmLog.SelectedBottleLog: TBottleLogList;
859 if tabBottleLog.TabIndex >= 0 then
860 Result := FBottleLogList.Items[tabBottleLog.TabIndex] as TBottleLogList
865 procedure TfrmLog.tabBottleLogChange(Sender: TObject);
867 // StatusBar
\82Ì
\8c\8f\90\94\95\
\8e¦
\82âListView.Items.Count
\82ð
\8dX
\90V
\82·
\82é
869 //
\83A
\83C
\83e
\83\80\82Ì
\91I
\91ð
\8fó
\91Ô
\82ð
\95\9c\8bA
\82·
\82é
870 with SelectedBottleLog do
871 if (SelectedIndex >= 0) and (Count > SelectedIndex) then
873 lvwLog.Items[SelectedIndex].Selected := true;
874 if lvwLog.Focused then lvwLog.Selected.Focused := true;
876 lvwLogChange(Self, nil, ctState);
879 procedure TfrmLog.LogLoaded(Sender: TObject);
881 if SelectedBottleLog = Sender then begin
886 procedure TfrmLog.UpdateTab;
889 cur := tabBottleLog.tabIndex;
890 tabBottleLog.Tabs.Clear;
891 for i := 0 to FBottleLogList.Count - 1 do begin
892 tabBottleLog.Tabs.Add((FBottleLogList[i] as TBottleLogList).Title);
894 if FBottleLogList.Count > 0 then begin
895 if cur < FBottleLogList.Count then
896 tabBottleLog.TabIndex := cur
898 tabBottleLog.TabIndex := FBottleLogList.Count-1;
902 procedure TfrmLog.LogLoadFailure(Sender: TObject; const Message: String);
905 ShowMessage(Message);
906 if Sender = SelectedBottleLog then UpdateWindow;
909 procedure TfrmLog.AgreeLog(const MID: String; const Agree: integer);
914 for i := 0 to FBottleLogList.Count - 1 do begin
915 if (FBottleLogList[i] as TBottleLogList).Bottle(MID) <> nil then begin
916 (FBottleLogList[i] as TBottleLogList).Bottle(MID).Agrees := Agree;
920 if flag then lvwLog.Invalidate;
923 procedure TfrmLog.VoteLog(const MID: String; const Vote: integer);
928 for i := 0 to FBottleLogList.Count - 1 do begin
929 if (FBottleLogList[i] as TBottleLogList).Bottle(MID) <> nil then begin
930 (FBottleLogList[i] as TBottleLogList).Bottle(MID).Votes := Vote;
934 if flag then lvwLog.Invalidate;
937 procedure TfrmLog.tabBottleLogChanging(Sender: TObject;
938 var AllowChange: Boolean);
940 //
\8c»
\8dÝ
\91I
\91ð
\82³
\82ê
\82Ä
\82¢
\82é
\83\8d\83O
\82Ì
\91I
\91ð
\8fó
\91Ô
\82ð
\95Û
\91¶
941 if SelectedBottleLog = nil then Exit;
942 if lvwLog.Selected <> nil then
943 SelectedBottleLog.SelectedIndex := lvwLog.Selected.Index
945 SelectedBottleLog.SelectedIndex := -1;
948 procedure TfrmLog.tabBottleLogContextPopup(Sender: TObject;
949 MousePos: TPoint; var Handled: Boolean);
951 with tabBottleLog do begin
952 Tag := IndexOfTabAt(MousePos.X, MousePos.Y);
953 if Tag < 0 then Handled := true;
957 procedure TfrmLog.mnCloseTabClick(Sender: TObject);
959 DoCloseTab(tabBottleLog.Tag);
962 procedure TfrmLog.tbtnFindBottleClick(Sender: TObject);
963 var ResultLog: TBottleLogList;
966 CList, GList: THashedStringList;
968 Application.CreateForm(TfrmSearchLog, frmSearchLog);
969 Cond := TSearchCond.Create(nil);
974 //
\8c»
\8dÝ
\83\8d\83O
\82É
\82 \82é
\83S
\81[
\83X
\83g
\82Æ
\83`
\83\83\83\93\83l
\83\8b\82Ì
\83\8a\83X
\83g
\82ð
\8eæ
\93¾
975 //
\8fd
\82½
\82¢
\82©
\82à??
976 CList := THashedStringList.Create;
977 GList := THashedStringList.Create;
979 for i := 0 to BottleLogList.Count-1 do
981 with BottleLogList[i] as TBottleLogList do
983 ExtractUniqueChannels(CList);
984 ExtractUniqueGhosts(GList);
989 ChannelList := CList;
998 Cond.Assign(Condition);
1001 frmSearchLog.Release;
1003 //
\8c\9f\8dõ
\8eÀ
\8ds
1004 ResultLog := DoSearchLog(Cond);
1005 //
\90V
\83^
\83u
\82ð
\8dì
\90¬
\82µ
\82Ä
\89æ
\96Ê
\8dX
\90V
1006 BottleLogList.Add(ResultLog);
1008 tabBottleLog.TabIndex := BottleLogList.Count-1;
1015 procedure TfrmLog.tbtnOpenLogClick(Sender: TObject);
1016 var BottleLog: TBottleLogList;
1020 OpenDialog.InitialDir := Pref.LogDir;
1021 if OpenDialog.Execute then begin
1022 for i := 0 to OpenDialog.Files.Count-1 do begin
1023 BottleLog := TBottleLogList.Create(ExtractFileName(OpenDialog.Files[i]));
1027 OnLoaded := LogLoaded;
1028 OnLoadFailure := LogLoadFailure;
1029 OnLoadWork := LogLoadWork;
1030 BottleLog.LoadFromXMLFile(OpenDialog.Files[i]);
1032 Index := BottleLogList.Add(BottleLog); //
\8dÅ
\8cã
\82É
\8aJ
\82¢
\82½
\83\8d\83O
\82Ì
\88Ê
\92u
\82ð
\8bL
\89¯
1038 if Index >= 0 then tabBottleLog.TabIndex := Index;
1043 function TfrmLog.GetDefaultFileName(const Name, Ext: String): String;
1045 Result := StringReplace(Name, '/', '', [rfReplaceAll]);
1046 Result := StringReplace(Result, ' ', '', [rfReplaceAll]);
1047 Result := SafeFileName(Result);
1048 Result := ChangeFileExt(Result, Ext);
1051 function TfrmLog.BottleLogTitled(const LogName: String): TBottleLogList;
1054 for i := 0 to FBottleLogList.Count-1 do begin
1055 if (FBottleLogList[i] as TBottleLogList).Title = LogName then begin
1056 Result := (FBottleLogList[i] as TBottleLogList);
1060 //
\8c©
\82Â
\82©
\82ç
\82È
\82¢
\8fê
\8d\87
1061 Result := TBottleLogList.Create(LogName); //
\90V
\82µ
\82
\8dì
\82é
1062 FBottleLogList.Add(Result);
1064 if FBottleLogList.Count = 1 then tabBottleLog.TabIndex := 0;
1067 procedure TfrmLog.AllBottleOpened;
1069 Log: TBottleLogList;
1071 for i := 0 to FBottleLogList.Count-1 do begin
1072 Log := FBottleLogList[i] as TBottleLogList;
1073 for j := 0 to Log.Count-1 do begin
1074 Log.Bottles[j].State := lsOpened;
1079 procedure TfrmLog.tabBottleLogMouseDown(Sender: TObject;
1080 Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
1083 if Button = mbMiddle then
1085 //
\92\86\83{
\83^
\83\93\83N
\83\8a\83b
\83N
\82Å
\83^
\83u
\8dí
\8f\9c
1086 DoCloseTab(tabBottleLog.IndexOfTabAt(X, Y));
1089 with tabBottleLog do begin
1090 Index := IndexOfTabAt(X, Y);
1091 if Index = -1 then Exit; //
\83^
\83u
\82ª
\82È
\82¢
\82Ì
\82Å
\83h
\83\89\83b
\83O
\82Å
\82«
\82È
\82¢
1092 if Button = mbLeft then begin
1093 FDragTabIndex := Index; //
\83h
\83\89\83b
\83O
\82·
\82é
\83^
\83u
\82Ì
\83C
\83\93\83f
\83b
\83N
\83X
\82ð
\95Û
\91¶
1095 FDragTabDest := -1; //
\83h
\83\89\83b
\83O
\98g
\90ü
\95`
\89æ
\83t
\83\89\83O
\83N
\83\8a\83A
\82Ì
\82½
\82ß
1101 procedure TfrmLog.tabBottleLogDragOver(Sender, Source: TObject; X,
1102 Y: Integer; State: TDragState; var Accept: Boolean);
1103 var TargetRect: TRect;
1104 OldDest, Index: integer;
1107 //
\83^
\83u
\82Ì
\83h
\83\89\83b
\83O(
\83^
\83u
\82Ì
\8f\87\94Ô
\93ü
\82ê
\91Ö
\82¦)
\82Ü
\82½
\82Í
\81A
1108 //
\83\8d\83O
\83A
\83C
\83e
\83\80\82Ì
\83h
\83\89\83b
\83O(
\83\8d\83O
\82ð
\95Ê
\82Ì
\83^
\83u
\82É
\88Ú
\93®)
\82Ì
1109 //
\97¼
\95û
\82Ì
\83h
\83\89\83b
\83O
\82ð
\8eó
\82¯
\95t
\82¯
\82é
1111 if Source = tabBottleLog then
1113 //
\83^
\83u
\82Ì
\8f\87\94Ô
\93ü
\82ê
\91Ö
\82¦
\82Ì
\8fê
\8d\87
1115 with tabBottleLog do begin
1116 OldDest := FDragTabDest;
1117 FDragTabDest := IndexOfTabAt(X, Y);
1118 if FDragTabDest = -1 then begin
1119 Accept := false; //
\82±
\82Ì
\8fê
\8d\87\82Í
\83h
\83\8d\83b
\83v
\82ð
\94F
\82ß
\82È
\82¢
1122 with Canvas do begin
1126 if (OldDest <> FDragTabDest) and (OldDest >= 0) then begin
1127 //
\88È
\91O
\82Ì
\98g
\90ü
\8fÁ
\8b\8e
1128 TargetRect := TabRect(OldDest);
1129 with Canvas do begin
1130 Brush.Style := bsClear;
1131 Rectangle(TargetRect.Left, TargetRect.Top,
1132 TargetRect.Right, TargetRect.Bottom);
1135 if (OldDest <> FDragTabDest) then begin
1136 //
\90V
\82µ
\82¢
\98g
\90ü
\95`
\89æ
1137 TargetRect := TabRect(FDragTabDest);
1138 with Canvas do begin
1139 Brush.Style := bsClear;
1140 Rectangle(TargetRect.Left, TargetRect.Top,
1141 TargetRect.Right, TargetRect.Bottom);
1145 end else if Source is TBottleLogDragObject then
1147 //
\83\8d\83O
\8d\80\96Ú
\82Ì
\83h
\83\89\83b
\83O(
\83\8d\83O
\82ð
\95Ê
\82Ì
\83^
\83u
\82É
\88Ú
\93®
\82·
\82é)
\82Ì
\8fê
\8d\87
1148 Index := tabBottleLog.IndexOfTabAt(X, Y);
1149 if tabBottleLog.TabIndex <> Index then
1151 FLVDragDest := -1; //
\98g
\90ü
\82Í
\82Ü
\82¾
\95\
\8e¦
\82³
\82ê
\82È
\82¢
\82Í
\82¸
1152 //
\83^
\83u
\82ð
\90Ø
\91Ö
\82¦
\82é
1153 tabBottleLogChanging(Self, dummy);
1154 tabBottleLog.TabIndex := Index;
1160 procedure TfrmLog.tabBottleLogDragDrop(Sender, Source: TObject; X,
1162 var DestIndex: integer;
1164 with tabBottleLog do begin
1165 DestIndex := IndexOfTabAt(X, Y);
1166 Tabs.Move(FDragTabIndex, DestIndex);
1167 FBottleLogList.Move(FDragTabIndex, DestIndex);
1171 procedure TfrmLog.tabBottleLogEndDrag(Sender, Target: TObject; X,
1174 //
\8b
\90§
\93I
\82É
\83^
\83u
\82ð
\8dÄ
\95`
\89æ
\82³
\82¹
\82é
\81B
\98g
\90ü
\8fÁ
\82µ
\91Î
\8dô
1175 tabBottleLog.Tabs.BeginUpdate;
1176 tabBottleLog.Tabs.EndUpdate;
1179 procedure TfrmLog.LogLoadWork(Sender: TObject);
1181 if Sender = SelectedBottleLog then
1184 lvwLog.Items.Count := SelectedBottleLog.Count;
1188 procedure TfrmLog.lvwLogDrawItem(Sender: TCustomListView; Item: TListItem;
1189 Rect: TRect; State: TOwnerDrawState);
1196 DummyStr: TStringList;
1198 Bottle := SelectedBottleLog.Bottles[Item.Index];
1199 if Bottle.HasURL = huUndefined then
1201 DummyStr := TStringList.Create;
1203 ExtractURLs(Bottle.Script, DummyStr);
1204 if DummyStr.Count > 0 then
1205 Bottle.HasURL := huYes
1207 Bottle.HasURL := huNo;
1213 //
\94w
\8ci
\8fÁ
\8b\8e
1214 ListView_GetItemRect(lvwLog.Handle, Item.Index, DestRect, LVIR_BOUNDS);
1216 //
\94w
\8ci
\82Ì
\90F
\82Í
\91I
\91ð
\8fó
\91Ô
\81E
\91I
\91ð
\94ñ
\83A
\83N
\83e
\83B
\83u
\8fó
\91Ô
\81E
\92Ê
\8fí
\8fó
\91Ô
\82Ì3
\92Ê
\82è
1217 lvwLog.Canvas.Brush.Style := bsSolid;
1218 if Item.Selected then begin
1219 if lvwLog.Focused then
1220 lvwLog.Canvas.Brush.Color := clHighlight
1222 lvwLog.Canvas.Brush.Color := clBtnFace;
1224 lvwLog.Canvas.Brush.Color := Pref.BgColor;
1226 lvwLog.Canvas.FillRect(DestRect);
1227 lvwLog.Canvas.Brush.Style := bsClear;
1228 //
\83t
\83H
\81[
\83J
\83X
\82ª
\82 \82é
\8fê
\8d\87\82É
\82Í
\83t
\83H
\81[
\83J
\83X
\82Ì
\98g
\90ü
\82ð
\88ø
\82
1229 if Item.Focused and lvwLog.Focused then
1230 lvwLog.Canvas.DrawFocusRect(DestRect);
1232 //
\83h
\83\89\83b
\83O
\92\86\82È
\82ç
\98g
\90ü
\82ð
\95`
\89æ
\82·
\82é
1233 if FLVDragDest = Item.Index then
1235 DestRect := Item.DisplayRect(drBounds);
1236 DrawListViewDragBorder(DestRect);
1239 if Item.Selected then
1241 if lvwLog.Focused then
1242 lvwLog.Canvas.Font.Color := clHighlightText
1244 lvwLog.Canvas.Font.Color := clWindowText;
1246 lvwLog.Canvas.Font.Color := Pref.TextColor;
1247 lvwLog.Canvas.Refresh;
1249 //
\83L
\83\83\83v
\83V
\83\87\83\93(
\93ú
\95t)
1250 ListView_GetItemRect(lvwLog.Handle, Item.Index, DestRect, LVIR_LABEL);
1251 Inc(DestRect.Left, 2);
1252 Inc(DestRect.Top, 2);
1253 Dec(DestRect.Right, 2);
1254 DrawTextEx(lvwLog.Canvas.Handle, PChar(Item.Caption), -1, DestRect,
1255 DT_SINGLELINE or DT_RIGHT, nil);
1256 ListView_GetItemRect(lvwLog.Handle, Item.Index, DestRect, LVIR_ICON);
1257 Ico := TIcon.Create;
1259 lvwLog.SmallImages.GetIcon(Item.ImageIndex, Ico);
1260 lvwLog.Canvas.Draw(DestRect.Left, DestRect.Top, Ico);
1264 //
\83L
\83\83\83v
\83V
\83\87\83\93\82Å
\82à
\83X
\83N
\83\8a\83v
\83g
\82Å
\82à
\82È
\82¢
\82à
\82Ì
1265 for sub := 0 to Item.SubItems.Count-1 do
1267 if sub = SubScript then Continue;
1268 ListView_GetSubItemRect(lvwLog.Handle, Item.Index, sub + 1,
1269 LVIR_BOUNDS, @DestRect);
1270 if DestRect.Right - DestRect.Left <= 16 then
1272 //
\8b·
\82·
\82¬
\82é
\8fê
\8d\87\82Í
\95¶
\8e\9a\97ñ
\82ð
\95`
\89æ
\82µ
\82È
\82¢
\81B
1273 // 16
\82Æ
\82¢
\82¤
\90\94\8e\9a\82Í
\8eÀ
\91ª
\92l
\81B
\89½
\82©
\82Ì
\83o
\83O
\82Á
\82Û
1274 lvwLog.Canvas.FillRect(DestRect);
1277 Inc(DestRect.Left, 2);
1278 Inc(DestRect.Top, 2);
1279 Dec(DestRect.Right, 2);
1280 Ex := DT_NOPREFIX or DT_SINGLELINE or DT_END_ELLIPSIS;
1281 if lvwLog.Columns[sub+1].Alignment = taRightJustify then
1282 Ex := Ex or DT_RIGHT;
1283 DrawTextEx(lvwLog.Canvas.Handle, PChar(Item.SubItems[sub]), -1, DestRect,
1286 //
\83X
\83N
\83\8a\83v
\83g
1287 ListView_GetSubItemRect(lvwLog.Handle, Item.Index, SubScript + 1,
1288 LVIR_BOUNDS, @DestRect);
1289 Script := Item.SubItems[SubScript];
1290 DrawSingleLineScript(Bottle, DestRect, Item);
1294 procedure TfrmLog.DrawSingleLineScript(LogItem: TLogItem;
1295 Rect: TRect; Item: TListItem);
1298 UnyuTalking, Synchronized, Spaced: boolean;
1299 Mark: TSsMarkUpType;
1302 procedure ScopeChange;
1304 if (not Spaced) and (Pref.LogListPreviewStyle = psTagStripped) then
1311 Script := LogItem.Script;
1314 if LogItem.HasURL = huYes then
1316 Ico := TIcon.Create;
1318 lvwLog.SmallImages.GetIcon(IconURL, Ico);
1319 lvwLog.Canvas.Draw(Rect.Left + x, Rect.Top, Ico);
1326 if Pref.LogListPreviewStyle = psNoColor then
1331 DrawTextEx(lvwLog.Canvas.Handle, PChar(Script), -1, Rect,
1332 DT_SINGLELINE or DT_END_ELLIPSIS or DT_NOPREFIX, nil);
1336 SsParser.LeaveEscape := Pref.LogListPreviewStyle = psNormal;
1337 SsParser.InputString := Script;
1339 UnyuTalking := false;
1340 Synchronized := false;
1341 Spaced := true; //
\83^
\83O
\8fÈ
\97ª
\95\
\8e¦
\8e\9e\82É
\95s
\95K
\97v
\82É
\83X
\83R
\81[
\83v
\95Ï
\8a·
\8e\9e\82Ì
\83X
\83y
\81[
\83X
\82ð
\8bó
\82¯
\82È
\82¢
1342 //
\82½
\82ß
\82Ì
\83t
\83\89\83O
1343 for i := 0 to SsParser.Count - 1 do begin
1344 if SsParser[i] = '\h' then
1346 UnyuTalking := false;
1348 end else if SsParser[i] = '\u' then
1350 UnyuTalking := true;
1352 end else if SsParser[i] = '\_s' then
1354 Synchronized := not Synchronized;
1356 end else if (Pos('\n', SsParser[i]) = 1) or (SsParser[i] = '\c') then
1360 Mark := SsParser.MarkUpType[i];
1364 lvwLog.Canvas.Font.Color := Pref.MetaWordColor;
1368 if Pref.LogListPreviewStyle = psNormal then
1369 lvwLog.Canvas.Font.Color := Pref.MarkUpColor
1375 lvwLog.Canvas.Font.Color := Pref.MarkErrorColor;
1378 if Synchronized then
1379 lvwLog.Canvas.Font.Color := Pref.TalkColorS
1380 else if UnyuTalking then
1381 lvwLog.Canvas.Font.Color := Pref.TalkColorU
1383 lvwLog.Canvas.Font.Color := Pref.TalkColorH;
1386 if Item.Selected then
1388 if lvwLog.Focused then
1389 lvwLog.Canvas.Font.Color := clHighlightText
1391 lvwLog.Canvas.Font.Color := clWindowText;
1393 lvwLog.Canvas.Refresh;
1394 w := lvwLog.Canvas.TextWidth(SsParser[i]);
1395 lvwLog.Canvas.TextRect(Rect, Rect.Left + x, Rect.Top + 2, SsParser[i]);
1397 if Rect.Right - Rect.Left < x then Break;
1401 procedure TfrmLog.mnListPreviewStyleClick(Sender: TObject);
1404 with PopupMenuListPreviewStyle do
1405 for i := 0 to Items.Count-1 do
1406 Items[i].Checked := (Sender as TMenuItem).Tag = Items[i].Tag;
1407 Pref.LogListPreviewStyle := TLogListPreviewStyle((Sender as TMenuItem).Tag);
1411 procedure TfrmLog.tbtnListPreviewStyleClick(Sender: TObject);
1414 sel := Ord(Pref.LogListPreviewStyle);
1416 if sel > Ord(High(TLogListPreviewStyle)) then sel := 0;
1417 Pref.LogListPreviewStyle := TLogListPreviewStyle(sel);
1421 procedure TfrmLog.PopupMenuListPreviewStylePopup(Sender: TObject);
1424 with PopupMenuListPreviewStyle do
1425 for i := 0 to Items.Count-1 do
1426 Items[i].Checked := Items[i].Tag = Ord(Pref.LogListPreviewStyle)
1429 procedure TfrmLog.PreviewStyleChange;
1431 if Pref.LogWindowPreviewStyle = psImageConversation then
1433 if Spps.Count = 0 then
1434 ShowMessage('
\83T
\81[
\83t
\83B
\83X
\83v
\83\8c\83r
\83\85\81[
\97p
\83v
\83\89\83O
\83C
\83\93\82ª
\91¶
\8dÝ
\82µ
\82Ü
\82¹
\82ñ
\81B');
1435 edtScript.Visible := false;
1436 TalkShowFrame.Visible := true;
1439 edtScript.Visible := true;
1440 TalkShowFrame.Visible := false;
1444 procedure TfrmLog.lvwLogDragOver(Sender, Source: TObject; X, Y: Integer;
1445 State: TDragState; var Accept: Boolean);
1449 Rec: TRect; //
\83_
\83~
\81[
\81B
1452 //
\82Æ
\82è
\82 \82¦
\82¸
\8eó
\82¯
\95t
\82¯
\82é
\89Â
\94\
\90«
\82ª
\82 \82é
\82Ì
\82ÍTBottleLogDragObject
\82¾
\82¯
1453 if not (Source is TBottleLogDragObject) then
1456 Target := lvwLog.GetItemAt(X, Y);
1458 //
\82±
\82ê
\88È
\91O
\82É
\95`
\89æ
\82³
\82ê
\82Ä
\82¢
\82½
\98g
\82Ì
\83C
\83\93\83f
\83b
\83N
\83X
1459 OldDest := FLVDragDest;
1461 //
\83h
\83\8d\83b
\83v
\88Ê
\92u
\82É Item
\82ª
\82 \82ê
\82Î
\83h
\83\8d\83b
\83v
\82ð
\8b\96\89Â
\82·
\82é
1462 if Target <> nil then
1465 FLVDragDest := Target.Index;
1472 //
\88È
\91O
\82Ì
\98g
\90ü
\82ð
\8dí
\8f\9c
1473 if (OldDest > -1) and (FLVDragDest <> OldDest) then
1475 Rec := lvwLog.Items[OldDest].DisplayRect(drBounds);
1476 DrawListViewDragBorder(Rec);
1478 //
\83h
\83\89\83b
\83O
\90æ
\82Ì
\98g
\90ü
\82ð
\95`
\89æ
1479 if (Target <> nil) and (FLVDragDest <> OldDest) then
1481 Rec := Target.DisplayRect(drBounds);
1482 DrawListViewDragBorder(Rec);
1485 //
\83X
\83N
\83\8d\81[
\83\8b\8aÖ
\8cW
1486 if lvwLog.Items.Count > 0 then
1488 if (lvwLog.topItem <> nil) and (Y - lvwLog.TopItem.Top < 10) then
1490 FLVScrollDir := lvScrollDown;
1491 if not timScrollTimer.Enabled then
1492 timScrollTimer.Enabled := true;
1493 end else if (lvwLog.Height - Y) < 10 then
1495 FLVScrollDir := lvScrollUp;
1496 if not timScrollTimer.Enabled then
1497 timScrollTimer.Enabled := true;
1500 timScrollTimer.Enabled := false;
1502 timScrollTimer.Enabled := false;
1505 procedure TfrmLog.lvwLogDragDrop(Sender, Source: TObject; X, Y: Integer);
1507 TargetItem: integer;
1508 Src: TBottleLogDragObject;
1511 timScrollTimer.Enabled := false;
1513 if not (Source is TBottleLogDragObject) then
1515 Src := Source as TBottleLogDragObject;
1517 if lvwLog.GetItemAt(X, Y) <> nil then
1518 TargetItem := lvwLog.GetItemAt(X, Y).Index
1522 lvwLog.Items.BeginUpdate; //
\83h
\83\8d\83b
\83v
\92\86\82Í
\95\
\8e¦
\82ð
\97}
\8e~
\82·
\82é
\81@
\8fd
\97v
\81I
1524 //
\83h
\83\8d\83b
\83v
\88Ê
\92u
\82É Item
\82ð
\88Ú
\93®
\82·
\82é
1525 if (GetAsyncKeyState(VK_CONTROL) and $8000) > 0 then
1526 begin //
\83R
\83s
\81[
\88Ú
\93®
\82Ì
\8fê
\8d\87
1527 SrcLog := TLogItem.Create(Src.LogItem);
1528 SelectedBottleLog.LogModified := true; //
\95Ï
\8dX
\88µ
\82¢
\82É
\82·
\82é
1529 end else //
\88Ú
\93®
\82¾
\82¯
\82·
\82é
\8fê
\8d\87
1531 SrcLog := Src.BottleLogList.Extract(Src.LogItem);
1532 //
\88Ú
\93®
\8c³
\82Æ
\88Ú
\93®
\90æ
\82ª
\88á
\82Á
\82Ä
\82¢
\82ê
\82Î
\97¼
\95û
\82Ì
\83t
\83\89\83O
\82ð
\97§
\82Ä
\82é
1533 if SelectedBottleLog.SelectedIndex <> Src.BottleLogList.SelectedIndex then
1535 Src.BottleLogList.LogModified := true; //
\88Ú
\93®
\8c³
1536 SelectedBottleLog.LogModified := true; //
\88Ú
\93®
\90æ
1539 if TargetItem >= 0 then
1541 //
\82·
\82Å
\82É
\91¶
\8dÝ
\82·
\82é
\83A
\83C
\83e
\83\80\82Ì
\8fã
\82É
\83h
\83\8d\83b
\83v
\82µ
\82½
\8fê
\8d\87
1542 SelectedBottleLog.Insert(TargetItem, SrcLog);
1545 // ListView
\82Ì
\97]
\94\92\82É
\83h
\83\8d\83b
\83v
\82µ
\82½
\8fê
\8d\87(Insert
\82Å
\82«
\82È
\82¢)
1546 TargetItem := SelectedBottleLog.Add(SrcLog);
1548 lvwLog.Items[TargetItem].Selected := true;
1549 lvwLog.Items[TargetItem].Focused := true;
1551 lvwLog.Items.EndUpdate;
1556 procedure TfrmLog.timScrollTimerTimer(Sender: TObject);
1558 ScrollHeight: Integer;
1560 //
\83X
\83N
\83\8d\81[
\83\8b\97Ê
\82ð
\8b\81\82ß
\82é
1562 if lvwLog.Items.Count > 2 then
1564 ScrollHeight := lvwLog.Items[1].Top - lvwLog.Items[0].Top;
1567 case FLVScrollDir of
1568 lvScrollUp: lvwLog.Scroll(0, ScrollHeight);
1569 lvSCrollDown: lvwLog.Scroll(0, -ScrollHeight);
1571 lvwLog.Invalidate; //
\8dÅ
\90V
\82Ì
\8fó
\91Ô
\82É
\8dÄ
\95`
\89æ
\82·
\82é
1575 procedure TfrmLog.mnChangeTabNameClick(Sender: TObject);
1578 Name := (FBottleLogList[tabBottleLog.Tag] as TBottleLogList).Title;
1579 InputQuery('
\96¼
\91O
\82Ì
\95Ï
\8dX', '
\90V
\82µ
\82¢
\83^
\83u
\82Ì
\96¼
\91O', Name);
1580 (FBottleLogList[tabBottleLog.Tag] as TBottleLogList).Title := Name;
1584 procedure TfrmLog.lvwLogStartDrag(Sender: TObject;
1585 var DragObject: TDragObject);
1586 var Drag: TBottleLogDragObject;
1588 //
\92Ê
\8fí
\82ÌListView
\97p
\82Ì
\83h
\83\89\83b
\83O
\83I
\83u
\83W
\83F
\83N
\83g
\82Í
1589 // OS
\82É
\82æ
\82Á
\82Ä
\82Í
\81A
\88Ú
\93®
\82·
\82é
\82Æ
\82«
\82É
\83A
\83C
\83e
\83\80\82Ì
\83C
\83\81\81[
\83W
\82ð
\94¼
\93§
\96¾
\82Å
\95`
\89æ
\82µ
\82Ä
\82µ
\82Ü
\82¤
\81B
1590 // TDragObject
\82©
\82ç
\92¼
\90Ú
\8cp
\8f³
\82µ
\82½
\82¾
\82¯
\82Ì
\82à
\82Ì(
\83C
\83\81\81[
\83W
\82ð
\8e\9d\82Á
\82Ä
\82¢
\82È
\82¢)
\82ð
\8eg
\82¤
\82Æ
1591 //
\94¼
\93§
\96¾
\83C
\83\81\81[
\83W
\82Ì
\95`
\89æ
\82Í
\97}
\90§
\82Å
\82«
\82é
\81B
1592 Drag := TBottleLogDragObject.Create(lvwLog);
1593 Drag.BottleLogList := SelectedBottleLog;
1594 Drag.LogItem := SelectedBottleLog.Bottles[lvwLog.Selected.Index];
1598 procedure TfrmLog.lvwLogEndDrag(Sender, Target: TObject; X, Y: Integer);
1600 //
\98g
\90ü
\8fÁ
\82µ
\97p
\82É
\8b
\90§
\93I
\82É
\8dÄ
\95`
\89æ
\82³
\82¹
\82é
1601 timScrollTimer.Enabled := false;
1606 procedure TfrmLog.DrawListViewDragBorder(const Rect: TRect);
1610 InflateRect(Rec, -1, -1);
1611 with lvwLog.Canvas do
1615 Brush.Style := bsClear;
1616 Refresh; //
\95K
\97v
1621 function TfrmLog.DoSaveLogXML(Log: TBottleLogList): integer;
1626 SaveDialog.FileName := GetDefaultFileName(Log.Title, '.xml');
1627 SaveDialog.InitialDir := Pref.LogDir;
1628 SaveDialog.DefaultExt := 'xml';
1629 SaveDialog.FilterIndex := 3;
1630 if SaveDialog.Execute then
1631 Log.SaveToXmlFile(SaveDialog.FileName)
1637 procedure TfrmLog.DoCloseTab(const Index: integer);
1640 PrevSelection: TBottleLogList; //
\95Â
\82¶
\82½
\82Æ
\82«
\83^
\83u
\82ª
\82¸
\82ê
\82È
\82¢
\82æ
\82¤
\82É
\82·
\82é
\8f\88\97\9d\97p
1643 if CheckLogSave(Index) = idCancel then exit; //
\83\8d\83O
\82Ì
\95Û
\91¶
\8am
\94F
1644 if Pref.ConfirmOnTabClose then
1646 Confirm := Format('
\83^
\83u"%s"
\82ð
\95Â
\82¶
\82Ü
\82·
\82©?', [(FBottleLogList[Index] as TBottleLogList).Title]);
1647 if MessageDlg(Confirm, mtConfirmation, mbOkCancel, 0) = mrCancel then
1650 PrevSelection := SelectedBottleLog;
1651 FBottleLogList.Delete(Index);
1653 //
\83^
\83u
\82¸
\82ê
\96h
\8e~
\8f\88\97\9d
1654 for i := 0 to FBottleLogList.Count-1 do
1655 if FBottleLogList[i] = PrevSelection then
1656 tabBottleLog.TabIndex := i;
1658 lvwLogChange(Self, nil, ctState);
1661 procedure TfrmLog.HTMLOutputWork(Sender: TObject; const Count: integer;
1662 var Canceled: boolean);
1664 frmHTMLOutputProgress.ProgressBar.Position := Count;
1665 Application.ProcessMessages;
1666 if frmHTMLOutputProgress.Canceled then
1670 function TfrmLog.DoSearchLog(Condition: TSearchCond): TBottleLogList;
1671 var i, UntilIndex: integer;
1673 Result := TBottleLogList.Create('
\8c\9f\8dõ
\8c\8b\89Ê');
1674 if Condition.SearchLogRange in [srSelectedLogList, srAboveSelectedLog] then
1676 if SelectedBottleLog = nil then
1678 ShowMessage('
\8c\9f\8dõ
\91Î
\8fÛ
\82ª
\82 \82è
\82Ü
\82¹
\82ñ');
1684 if Condition.SearchLogRange = srSelectedLogList then
1686 else if lvwLog.Selected = nil then
1689 UntilIndex := lvwLog.Selected.Index;
1690 SearchLogIndivisual(Condition, SelectedBottleLog, Result, UntilIndex);
1692 end else if Condition.SearchLogRange = srAllLogLists then
1694 for i := 0 to BottleLogList.Count-1 do
1696 SearchLogIndivisual(Condition, BottleLogList[i] as TBottleLogList,
1701 if Result.Count = 0 then
1702 Result.AddSystemLog('
\8c©
\82Â
\82©
\82è
\82Ü
\82¹
\82ñ
\82Å
\82µ
\82½
\81B');
1705 procedure TfrmLog.SearchLogIndivisual(Condition: TSearchCond; LogList,
1706 Result: TBottleLogList; UntilIndex: integer = -1);
1709 Bottle, New: TLogItem;
1712 // 1
\8cÂ
\82Ì
\83\8d\83O
\83^
\83u
\82É
\91Î
\82µ
\82Ä
\8c\9f\8dõ
\82ð
\82©
\82¯
\82é
\81BUntilIndex
\82Å
\94Í
\88Í
\8ew
\92è(
\8fÈ
\97ª
\8e\9e\82»
\82Ì
\83^
\83u
\91S
\91Ì)
1713 if UntilIndex >= 0 then
1716 Max := LogList.Count-1;
1717 for i := 0 to Max do
1719 //
\8fð
\8c\8f\94»
\92è
1720 Bottle := LogList.Bottles[i];
1721 if Bottle.LogType <> ltBottle then
1724 //
\83X
\83N
\83\8a\83v
\83g
\83p
\83^
\81[
\83\93\82Å
\89ð
\90Í
1725 if Condition.ScriptPattern <> '' then
1727 if Condition.ScriptRegExp then
1730 if not RegExp.Match(Condition.ScriptPattern, Bottle.Script) then
1734 Ok := false; //
\96
\82È
\90³
\8bK
\95\
\8c»
\82ð
\8fR
\82é
1738 if not AnsiContainsText(Bottle.Script, Condition.ScriptPattern) then
1742 //
\83`
\83\83\83\93\83l
\83\8b\96¼
\81A
\83S
\81[
\83X
\83g
\96¼
\81A
\93\8a\95[
\93¯
\88Ó
1743 if Condition.Channel <> '' then
1744 if not AnsiContainsText(Bottle.Channel, Condition.Channel) then
1746 if Condition.Ghost <> '' then
1747 if not AnsiContainsText(Bottle.Ghost, Condition.Ghost) then
1749 if Condition.MinVote > Bottle.Votes then
1751 if Condition.MinAgree > Bottle.Agrees then
1753 //
\8fð
\8c\8f\82É
\88ê
\92v
\82µ
\82½
\82à
\82Ì
\82ð
\8c\8b\89Ê
\83\8a\83X
\83g
\82É
\92Ç
\89Á
1756 New := TLogItem.Create(Bottle); //
\83R
\83s
\81[
\83R
\83\93\83X
\83g
\83\89\83N
\83^
1757 New.State := lsOpened;
1763 { TBottleLogDragObject }
1765 function TBottleLogDragObject.GetDragImages: TDragImageList;
1767 //
\92\86\93r
\94¼
\92[
\82È
\83h
\83\89\83b
\83O
\83C
\83\81\81[
\83W
\82ð
\95\
\8e¦
\82µ
\82È
\82¢
\82æ
\82¤
\82É
\82·
\82é
1771 procedure TBottleLogDragObject.SetBottleLogList(
1772 const Value: TBottleLogList);
1774 FBottleLogList := Value;
1777 procedure TBottleLogDragObject.SetLogItem(const Value: TLogItem);
1782 procedure TfrmLog.mnTabSaveXMLLogClick(Sender: TObject);
1784 DoSaveLogXML(FBottleLogList[tabBottleLog.Tag] as TBottleLogList);
1787 procedure TfrmLog.mnSaveHTMLClick(Sender: TObject);
1789 LogList, SB: TBottleLogList;
1791 Options: THTMLOutputOptions;
1793 SB := SelectedBottleLog;
1796 if SB.Count = 0 then
1798 Application.CreateForm(TfrmHTMLOutputConfig, frmHTMLOutputConfig);
1799 with frmHTMLOutputConfig do
1801 // Show HTML save option dialog
1804 LogList := TBottleLogList.Create('');
1808 for i := SB.Count-1 downto 0 do
1809 if SB.Bottles[i].LogType = ltBottle then
1810 LogList.Add(TLogItem.Create(SB.Bottles[i]));
1812 if SB.Bottles[lvwLog.Selected.Index].LogType = ltBottle then
1813 LogList.Add(TLogItem.Create(SB.Bottles[lvwLog.Selected.Index]))
1815 ShowMessage('
\82±
\82Ì
\83\81\83b
\83Z
\81[
\83W
\82Í
\95Û
\91¶
\82Å
\82«
\82Ü
\82¹
\82ñ');
1817 for i := lvwLog.Selected.Index downto 0 do
1818 if SB.Bottles[i].LogType = ltBottle then
1819 LogList.Add(TLogItem.Create(SB.Bottles[i]));
1821 Options.ImageDir := ImageDir;
1822 Options.UseColor := UseColor;
1823 Options.ImageType := ImageType;
1824 Application.CreateForm(TfrmHTMLOutputProgress, frmHTMLOutputProgress);
1826 frmHTMLOutputProgress.Show;
1827 LogList.OnHTMLOutputWork := HTMLOutputWork;
1828 LogList.SaveToHTML(FileName, Options, SsParser);
1830 frmHTMLOutputProgress.Release;
1840 procedure TfrmLog.mnPopupCopyGhostClick(Sender: TObject);
1845 Log := SelectedBottleLog.Bottles[frmLog.lvwLog.Selected.Index];
1846 if Log = nil then Exit;
1847 Clip := ClipBoard();
1848 Clip.SetTextBuf(PChar(Log.Ghost));
1851 function TfrmLog.CheckLog(Sender: TObject): integer;
1855 //
\91S
\82Ä
\82Ì
\83\8a\83X
\83g
\81i
\83^
\83u
\81j
\83`
\83F
\83b
\83N
\82·
\82é
1856 // frmSender
\82©
\82ç
\8fI
\97¹
\8e\9e\82É
\8cÄ
\82Ñ
\8fo
\82³
\82ê
\82é
1858 for i := 0 to BottleLogList.Count-1 do
1860 Res := CheckLogSave(i);
1861 if Res = idCancel then break;
1866 function TfrmLog.CheckLogSave(const Index: integer): integer;
1871 //
\83\8a\83X
\83g
\82ð
\83`
\83F
\83b
\83N
\82µ
\81A
\95Û
\91¶
\8f\88\97\9d\82ð
\8cÄ
\82Ñ
\8fo
\82·
1873 if (BottleLogList[Index] as TBottleLogList).LogModified then
1875 Confirm := Format('
\83^
\83u %s
\82Ì
\93à
\97e
\82Í
\95Ï
\8dX
\82³
\82ê
\82Ä
\82¢
\82Ü
\82·
\81B'#13#10#13#10 +
1876 '
\95Û
\91¶
\82µ
\82Ü
\82·
\82©
\81H', [(FBottleLogList[Index] as TBottleLogList).Title]);
1877 Res := MessageDlg(Confirm, mtConfirmation, mbYesNoCancel, 0);
1879 Res := DoSaveLogXML(FBottleLogList[Index] as TBottleLogList);
1884 procedure TfrmLog.mnTestActionClick(Sender: TObject);
1886 //
\82±
\82±
\82©
\82ç
\83A
\83N
\83V
\83\87\83\93
1887 Screen.Cursor := crHourGlass;
1888 frmSender.LogInsertCue(true, false); //
\83A
\83N
\83V
\83\87\83\93\83e
\83X
\83g
\81i
\98A
\91±
\8dÄ
\90¶
\81j
1889 Screen.Cursor := crDefault;
1892 procedure TfrmLog.mnSelActionClick(Sender: TObject);
1894 //
\92P
\91Ì
\83A
\83N
\83V
\83\87\83\93\82Ì
\97L
\96³
\82ð
\90Ý
\92è
1895 if mnSelAction.Checked then
1896 mnSelAction.Checked := false
1898 mnSelAction.Checked := true;
1899 Pref.LogAction := mnSelAction.Checked;
1902 procedure TfrmLog.mnAllActionClick(Sender: TObject);
1904 //
\82±
\82Ì
\83^
\83u
\93à
\91S
\82Ä
\83A
\83N
\83V
\83\87\83\93
1905 Screen.Cursor := crHourGlass;
1906 frmSender.LogInsertCue(true, true); //
\83A
\83N
\83V
\83\87\83\93\83e
\83X
\83g
\81i
\98A
\91±
\8dÄ
\90¶
\81\95\91S
\82Ä
\81j
1907 Screen.Cursor := crDefault;