OSDN Git Service

クリップ時に保存確認しないように修正。
[winbottle/winbottle.git] / bottleclient / LogForm.pas
index 9366f11..bfcb5e8 100755 (executable)
@@ -78,6 +78,9 @@ type
     mnTabSaveXMLLog: TMenuItem;
     mnSaveHTML: TMenuItem;
     mnPopupCopyGhost: TMenuItem;
+    PopupMenuAction: TPopupMenu;
+    mnTestAction: TMenuItem;
+    mnSelAction: TMenuItem;
     procedure tbtnClearClick(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure lvwLogChange(Sender: TObject; Item: TListItem;
@@ -129,6 +132,8 @@ type
     procedure mnTabSaveXMLLogClick(Sender: TObject);
     procedure mnSaveHTMLClick(Sender: TObject);
     procedure mnPopupCopyGhostClick(Sender: TObject);
+    procedure mnTestActionClick(Sender: TObject);
+    procedure mnSelActionClick(Sender: TObject);
   private
     { Private \90é\8c¾ }
     FLastScript: String; //\83X\83N\83\8a\83v\83g\8dÄ\95`\89æ\97}\90§\97p
@@ -152,11 +157,12 @@ type
       Item: TListItem);
     procedure PreviewStyleChange;
     procedure DrawListViewDragBorder(const Rect: TRect);
-    procedure DoSaveLogXML(Log: TBottleLogList);
+    function DoSaveLogXML(Log: TBottleLogList): integer;
     procedure DoCloseTab(const Index: integer);
     function DoSearchLog(Condition: TSearchCond): TBottleLogList;
     procedure SearchLogIndivisual(Condition: TSearchCond;
       LogList, Result: TBottleLogList; UntilIndex: integer = -1);
+    function CheckLogSave(const Index: integer): integer;
   protected
     procedure CreateParams(var Params: TCreateParams); override;
   public
@@ -178,6 +184,7 @@ type
     procedure UpdateTab;
     procedure UpdateWindow;
     procedure SelAndFocusMessage(const MID: String);
+    function CheckLog(Sender: TObject): integer;
   end;
 
   TBottleLogDragObject = class(TDragControlObjectEx)
@@ -221,6 +228,7 @@ procedure TfrmLog.AddCurrentScriptLog(const LogName, Script, Channel, MID, Ghost
 var Sel: integer;
 begin
   BottleLogTitled(LogName).AddScriptLog(Script, Channel, MID, Ghost, LogTime, Vote, Agree);
+  BottleLogTitled(LogName).LogModified := true; // \82±\82Ì\83\8a\83X\83g\82Í\95Ï\8dX\82³\82ê\82½
   if SelectedBottleLog <> BottleLogTitled(LogName) then Exit;
   lvwLog.OnChange := nil; //\83C\83x\83\93\83g\94­\90¶(\82¢\82ë\82¢\82ë\8dÄ\95`\89æ\82ª\8bN\82«\82é)\82Ì\97}\90§
   if lvwLog.Selected <> nil then Sel := lvwLog.Selected.Index else Sel := -1;
@@ -294,6 +302,8 @@ begin
   TalkShowFrame.SetPreviewFont(edtScript.Font);
   TalkShowFrame.PrevControl := lvwLog;
 
+  mnSelAction.Checked := Pref.LogAction; // \8f\89\8aú\89»
+
   PreviewStyleChange;
   UpdateWindow; // Reset window color and enabled status of some buttons
 end;
@@ -383,7 +393,7 @@ begin
   if Log.LogType <> ltBottle then
     Exit;
   //\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¢
-  if Pref.LogOneAction then
+  if Pref.LogAction then
   begin
     Script :=  Log.Script;
     ErrorMes := '';
@@ -404,11 +414,10 @@ begin
   CueItem := TLogItem.Create(Log);
   try
     //\83A\83N\83V\83\87\83\93\82ª\97L\8cø\82Å\82 \82ê\82Î\92Ê\8fí\8f\88\97\9d\8fÈ\97ª
-    if Pref.LogOneAction then
-    begin
+    if Pref.LogAction then
       //\8c^\95Ï\8a·\82Æ\8eó\90M
-      frmSender.BottleCnv(CueItem);
-    end else
+      frmSender.BottleCnv(CueItem)
+    else
     begin
       //\83`\83\83\83\93\83l\83\8b\83S\81[\83X\83g\91Î\8dô
       if CueItem.Ghost = '' then
@@ -561,7 +570,7 @@ procedure TfrmLog.mnSaveLogClick(Sender: TObject);
 begin
   if SelectedBottleLog = nil then Exit;
   SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.log');
-  SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
+  SaveDialog.InitialDir := Pref.LogDir;
   SaveDialog.DefaultExt := 'log';
   SaveDialog.FilterIndex := 1;
   if SaveDialog.Execute then
@@ -572,7 +581,7 @@ procedure TfrmLog.mnSaveLogChannelClick(Sender: TObject);
 begin
   if SelectedBottleLog = nil then Exit;
   SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.log');
-  SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
+  SaveDialog.InitialDir := Pref.LogDir;
   SaveDialog.DefaultExt := 'log';
   SaveDialog.FilterIndex := 1;
   if SaveDialog.Execute then
@@ -583,7 +592,7 @@ procedure TfrmLog.mnSaveLogScriptClick(Sender: TObject);
 begin
   if SelectedBottleLog = nil then Exit;
   SaveDialog.FileName := GetDefaultFileName(SelectedBottleLog.Title, '.txt');
-  SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
+  SaveDialog.InitialDir := Pref.LogDir;
   SaveDialog.DefaultExt := 'txt';
   SaveDialog.FilterIndex := 2;
   if SaveDialog.Execute then
@@ -695,8 +704,6 @@ procedure TfrmLog.mnURLClick(Sender: TObject);
 var LogItem: TLogItem;
     URL: string;
     Urls: TStringList;
-    Command: string;
-
 begin
   if (lvwLog.Selected = nil) or (SelectedBottleLog = nil) then Exit;
   LogItem := SelectedBottleLog[lvwLog.Selected.Index] as TLogItem;
@@ -704,15 +711,7 @@ begin
   try
     ExtractURLs(LogItem.Script, Urls);
     URL := Urls[(Sender as TMenuItem).Tag];
-    if Pref.BrowserExeName='' then
-    begin
-      ShellExecute(Handle, 'open', PChar(URL), nil, nil, SW_SHOW);
-    end else
-    begin
-      Command := Pref.BrowserExeName+' '+URL;
-      WinExec(PChar(Command), SW_SHOW);
-    end;
-
+    frmSender.OpenBrowser(URL);
   finally
     Urls.Free;
   end;
@@ -1016,6 +1015,7 @@ var BottleLog: TBottleLogList;
     i, Index: integer;
 begin
   Index := -1;
+  OpenDialog.InitialDir := Pref.LogDir;
   if OpenDialog.Execute then begin
     for i := 0 to OpenDialog.Files.Count-1 do begin
       BottleLog := TBottleLogList.Create(ExtractFileName(OpenDialog.Files[i]));
@@ -1078,13 +1078,20 @@ procedure TfrmLog.tabBottleLogMouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var Index: integer;
 begin
-  with tabBottleLog do begin
-    Index := IndexOfTabAt(X, Y);
-    if Index = -1 then Exit; //\83^\83u\82ª\82È\82¢\82Ì\82Å\83h\83\89\83b\83O\82Å\82«\82È\82¢
-    if Button = mbLeft then begin
-      FDragTabIndex := Index; //\83h\83\89\83b\83O\82·\82é\83^\83u\82Ì\83C\83\93\83f\83b\83N\83X\82ð\95Û\91
-      BeginDrag(False);
-      FDragTabDest := -1;     //\83h\83\89\83b\83O\98g\90ü\95`\89æ\83t\83\89\83O\83N\83\8a\83A\82Ì\82½\82ß
+  if Button = mbMiddle then
+  begin
+    //\92\86\83{\83^\83\93\83N\83\8a\83b\83N\82Å\83^\83u\8dí\8f\9c
+    DoCloseTab(tabBottleLog.IndexOfTabAt(X, Y));
+  end else
+  begin
+    with tabBottleLog do begin
+      Index := IndexOfTabAt(X, Y);
+      if Index = -1 then Exit; //\83^\83u\82ª\82È\82¢\82Ì\82Å\83h\83\89\83b\83O\82Å\82«\82È\82¢
+      if Button = mbLeft then begin
+        FDragTabIndex := Index; //\83h\83\89\83b\83O\82·\82é\83^\83u\82Ì\83C\83\93\83f\83b\83N\83X\82ð\95Û\91
+        BeginDrag(False);
+        FDragTabDest := -1;     //\83h\83\89\83b\83O\98g\90ü\95`\89æ\83t\83\89\83O\83N\83\8a\83A\82Ì\82½\82ß
+      end;
     end;
   end;
 end;
@@ -1516,9 +1523,16 @@ begin
     if (GetAsyncKeyState(VK_CONTROL) and $8000) > 0 then
     begin // \83R\83s\81[\88Ú\93®\82Ì\8fê\8d\87
       SrcLog := TLogItem.Create(Src.LogItem);
+      SelectedBottleLog.LogModified := true; // \95Ï\8dX\88µ\82¢\82É\82·\82é
     end else // \88Ú\93®\82¾\82¯\82·\82é\8fê\8d\87
     begin
       SrcLog := Src.BottleLogList.Extract(Src.LogItem);
+      // \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é
+      if SelectedBottleLog.SelectedIndex <> Src.BottleLogList.SelectedIndex then
+      begin
+        Src.BottleLogList.LogModified := true; // \88Ú\93®\8c³
+        SelectedBottleLog.LogModified := true; // \88Ú\93®\90æ
+      end;
     end;
     if TargetItem >= 0 then
     begin
@@ -1602,14 +1616,20 @@ begin
   end;
 end;
 
-procedure TfrmLog.DoSaveLogXML(Log: TBottleLogList);
+function TfrmLog.DoSaveLogXML(Log: TBottleLogList): integer;
+var
+  Res: integer;
 begin
+  Res := idYes;
   SaveDialog.FileName := GetDefaultFileName(Log.Title, '.xml');
-  SaveDialog.InitialDir := ExtractFileDir(Application.ExeName);
+  SaveDialog.InitialDir := Pref.LogDir;
   SaveDialog.DefaultExt := 'xml';
   SaveDialog.FilterIndex := 3;
   if SaveDialog.Execute then
-    Log.SaveToXmlFile(SaveDialog.FileName);
+    Log.SaveToXmlFile(SaveDialog.FileName)
+  else
+    Res := idCancel;
+  Result := Res;
 end;
 
 procedure TfrmLog.DoCloseTab(const Index: integer);
@@ -1618,6 +1638,7 @@ var
   PrevSelection: TBottleLogList; // \95Â\82\82½\82Æ\82«\83^\83u\82ª\82¸\82ê\82È\82¢\82æ\82¤\82É\82·\82é\8f\88\97\9d\97p
   i: integer;
 begin
+  if CheckLogSave(Index) = idCancel then exit; // \83\8d\83O\82Ì\95Û\91\8am\94F
   if Pref.ConfirmOnTabClose then
   begin
     Confirm := Format('\83^\83u"%s"\82ð\95Â\82\82Ü\82·\82©?', [(FBottleLogList[Index] as TBottleLogList).Title]);
@@ -1825,4 +1846,54 @@ begin
   Clip.SetTextBuf(PChar(Log.Ghost));
 end;
 
+function TfrmLog.CheckLog(Sender: TObject): integer;
+var
+  i, Res: integer;
+begin
+  // \91S\82Ä\82Ì\83\8a\83X\83g\81i\83^\83u\81j\83`\83F\83b\83N\82·\82é
+  // frmSender\82©\82ç\8fI\97¹\8e\9e\82É\8cÄ\82Ñ\8fo\82³\82ê\82é
+  Res := idNo;
+  for i := 0 to BottleLogList.Count-1 do
+  begin
+    Res := CheckLogSave(i);
+    if Res = idCancel then break;
+  end;
+  Result := Res;
+end;
+
+function TfrmLog.CheckLogSave(const Index: integer): integer;
+var
+  Res: integer;
+  Confirm: string;
+begin
+  // \83\8a\83X\83g\82ð\83`\83F\83b\83N\82µ\81A\95Û\91\8f\88\97\9d\82ð\8cÄ\82Ñ\8fo\82·
+  Res := idNo;
+  if (BottleLogList[Index] as TBottleLogList).LogModified then
+  begin
+    Confirm := Format('\83^\83u %s \82Ì\93à\97e\82Í\95Ï\8dX\82³\82ê\82Ä\82¢\82Ü\82·\81B'#13#10#13#10 +
+      '\95Û\91\82µ\82Ü\82·\82©\81H', [(FBottleLogList[Index] as TBottleLogList).Title]);
+    Res := MessageDlg(Confirm, mtConfirmation, mbYesNoCancel, 0);
+    if Res = idYes then
+      Res := DoSaveLogXML(FBottleLogList[Index] as TBottleLogList);
+  end;
+  Result := Res;
+end;
+
+procedure TfrmLog.mnTestActionClick(Sender: TObject);
+begin
+  Screen.Cursor := crHourGlass;
+  frmSender.LogInsertCue(true); // \83A\83N\83V\83\87\83\93\83e\83X\83g\81i\98A\91±\8dÄ\90\81j\97L\8cø
+  Screen.Cursor := crDefault;
+end;
+
+procedure TfrmLog.mnSelActionClick(Sender: TObject);
+begin
+  // \92P\91Ì\83A\83N\83V\83\87\83\93\82Ì\97L\96³\82ð\90Ý\92è
+  if mnSelAction.Checked then
+    mnSelAction.Checked := false
+  else
+    mnSelAction.Checked := true;
+  Pref.LogAction := mnSelAction.Checked;
+end;
+
 end.