OSDN Git Service

・板一覧更新の処理メッセージを追加
[gikonavigoeson/gikonavi.git] / Round.pas
1 unit Round;
2
3 interface
4
5 uses
6         Windows, Classes, Controls, Forms, StdCtrls, ComCtrls, Menus,
7         SysUtils, ImgList, ExtCtrls, GikoSystem, GikoUtil;
8
9 type
10         TRoundDialog = class(TForm)
11         RoundPopupMenu: TPopupMenu;
12         C1: TMenuItem;
13         P1: TMenuItem;
14                 N1: TMenuItem;
15         D1: TMenuItem;
16                 ItemIcon16: TImageList;
17         Panel1: TPanel;
18         Label1: TLabel;
19         Label2: TLabel;
20         RoundNameComboBox: TComboBox;
21         Panel2: TPanel;
22         Panel3: TPanel;
23         AllSelectButton: TButton;
24         AllCancelButton: TButton;
25         RoundDeleteButton: TButton;
26         Panel4: TPanel;
27         Button1: TButton;
28         RoundButton: TButton;
29         StatusBar1: TStatusBar;
30         RoundListView: TListView;
31                 procedure RoundButtonClick(Sender: TObject);
32                 procedure FormCreate(Sender: TObject);
33                 procedure RoundListViewChange(Sender: TObject; Item: TListItem;
34                         Change: TItemChange);
35                 procedure AllSelectButtonClick(Sender: TObject);
36                 procedure AllCancelButtonClick(Sender: TObject);
37                 procedure RoundNameComboBoxChange(Sender: TObject);
38                 procedure RoundDeleteButtonClick(Sender: TObject);
39     procedure RoundListViewColumnClick(Sender: TObject;
40       Column: TListColumn);
41     procedure RoundListViewCompare(Sender: TObject; Item1,
42       Item2: TListItem; Data: Integer; var Compare: Integer);
43     procedure RoundListViewColumnRightClick(Sender: TObject;
44       Column: TListColumn; Point: TPoint);
45         private
46                 { Private \90é\8c¾ }
47                 FColumnToSort: Integer;
48                 FSortOrder:     Boolean;
49                 function GetRoundCount: Integer;
50                 procedure SetRoundItem(RoundName: string);
51                 function CompareTime(Time1: TDateTime; Time2: TDateTime; MarginMin: Integer): Boolean;
52         public
53                 { Public \90é\8c¾ }
54         end;
55
56
57 implementation
58
59 uses
60         Giko, BoardGroup, RoundData, Math, GikoDataModule;
61
62 {$R *.DFM}
63
64 procedure TRoundDialog.RoundButtonClick(Sender: TObject);
65 var
66         i: Integer;
67         cnt: Integer;
68         msg: string;
69         Board: TBoard;
70         ThreadItem: TThreadItem;
71         RoundItem: TRoundItem;
72 begin
73 {$IF Defined(FRCRND) }
74         GikoDM.LoginAction.Checked := true; // \93®\8dì\8e\8e\8c±\97p\93r
75 {$IFEND}
76
77 {$IFNDEF LOOSENUP}      //\8f\84\89ñ\90§\8cÀ\82ð\8aÉ\82ß\82é\82±\82Æ\82É\82µ\82Ä\82½\82ç{$ELSE}\82Ì\95û\82ð\8eg\82¤
78         if not GikoDM.LoginAction.Checked then begin
79                 if GikoSys.Setting.UserID <> '' then begin
80                         msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ' + #13#10
81                                 + '\8d¡\83\8d\83O\83C\83\93\82µ\82Ü\82·\82©';
82                         if MsgBox(Handle, msg, '\8am\94F', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) <> IDYES then begin
83                                 Exit;
84                         end;
85                         GikoDM.LoginAction.Execute;
86                 end;
87                 if not GikoDM.LoginAction.Checked then begin
88                         msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ';
89                         MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
90                         Exit;
91                 end;
92         end;
93 {$ELSE}
94         //\8bK\90§\82ð\8aÉ\82ß\82½\82Ù\82¤\82Í\81A\83X\83\8c\88ê\97\97\82Ì\82Ý\8f\84\89ñ\89Â\94\
95         if not GikoDM.LoginAction.Checked then begin
96                 if GikoSys.Setting.UserID <> '' then begin
97                         msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\83X\83\8c\83b\83h\82Ì\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ' + #13#10
98                                 + '\8d¡\83\8d\83O\83C\83\93\82µ\82Ü\82·\82©';
99                         if MsgBox(Handle, msg, '\8am\94F', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) <> IDYES then begin
100                                 Exit;
101                         end;
102                         GikoDM.LoginAction.Execute;
103                 end;
104         end;
105         //\81\9c\82È\82µ\8f\84\89ñ\82Í15\95ª\88È\8fã\82Ì\8aÔ\8au\82ð\95K\97v\82Æ\82·\82é
106         if not GikoDM.LoginAction.Checked then begin
107                 if CompareTime(GikoForm.LastRoundTime, Now, 30) then begin
108                         msg := '\88ê\93x\8f\84\89ñ\82·\82é\82Æ\82R\82O\95ª\8aÔ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ';
109                         MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
110                         Exit;
111                 end;
112         end;
113 {$ENDIF}
114
115         //\88ê\82Â\82à\8f\84\89ñ\82É\90Ý\92è\82µ\82Ä\82¢\82È\82©\82Á\82½\82ç\83G\83\89\81[\82É\82·\82é
116         cnt := GetRoundCount;
117         if cnt = 0 then begin
118                 msg := '\8f\84\89ñ\82µ\82½\82¢\8d\80\96Ú\82É\82P\82Â\88È\8fã\83`\83F\83b\83N\82ð\93ü\82ê\82Ä\82­\82¾\82³\82¢';
119                 MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
120                 Exit;
121         end;
122
123 {$IFNDEF LOOSENUP}
124         //\81\9c\82È\82µ\8f\84\89ñ\82Í\82P\93x\82É100\8cÂ\82Ü\82Å\82É\82·\82é
125         if not GikoDM.LoginAction.Checked then begin
126                 if cnt > 100 then begin
127                         msg := '\82P\82O\82O\8cÂ\88È\8fã\82Í\88ê\93x\82É\8f\84\89ñ\82Å\82«\82Ü\82¹\82ñ';
128                         MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
129                         Exit;
130                 end;
131         end;
132 {$ENDIF}
133
134         //\8f\84\89ñ\82É\93o\98^\82³\82ê\82Ä\82¢\82é\94Â\82Ì\90\94\82¾\82¯\82Ü\82í\82·
135         for i := 0 to RoundList.Count[grtBoard] - 1 do begin
136                 RoundItem := RoundList.Items[i, grtBoard];
137                 //\8f\84\89ñ\82Ì\83`\83F\83b\83N\82ª\82Â\82¢\82Ä\82¢\82È\82¯\82ê\82Î\83X\83\8b\81[
138                 if not RoundItem.BoolData then Continue;
139                 //\8am\8eÀ\82É\94Â\82Ì\82Í\82¸\82¾\82¯\82Ç\83`\83F\83b\83N
140                 if RoundItem.RoundType = grtBoard then begin
141                         Board := TBoard( RoundItem.Item );
142                         //Board\82Ì\83I\83u\83W\83F\83N\83g\82ª\91\8dÝ\82·\82ê\82Î\81ADL\82·\82é
143                         if Board <> nil then begin
144                                 if not Board.IsThreadDatRead then
145                                         GikoSys.ReadSubjectFile(Board);
146                                 GikoForm.DownloadList(Board);
147                         end;
148                 end;
149         end;
150         for i := 0 to RoundList.Count[grtItem] - 1 do begin
151                 RoundItem := RoundList.Items[i, grtItem];
152                 //\8f\84\89ñ\82Ì\83`\83F\83b\83N\82ª\82Â\82¢\82Ä\82¢\82È\82¯\82ê\82Î\83X\83\8b\81[
153                 if not RoundItem.BoolData then Continue;
154 {$IFDEF LOOSENUP}
155                 //\81\9c\82È\82µ\8f\84\89ñ\82Í\83X\83\8c\83b\83h\82Í\82Å\82«\82È\82¢\82±\82Æ\82É\82·\82é
156                 if not GikoDM.LoginAction.Checked then begin
157                         msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\83X\83\8c\83b\83h\82Ì\8f\84\89ñ\82Í\82Å\82«\82Ü\82¹\82ñ\81B';
158                         MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
159                         break;
160                 end;
161 {$ENDIF}
162                 if RoundItem.RoundType = grtItem then begin
163                         ThreadItem := TThreadItem( RoundItem.Item );
164                         if ThreadItem <> nil then begin
165                                 GikoForm.DownloadContent(ThreadItem);
166                         end;
167                 end;
168         end;
169         GikoForm.LastRoundTime := Now;
170         Close;
171 end;
172
173 function TRoundDialog.GetRoundCount: Integer;
174 var
175         i: Integer;
176         RoundItem: TRoundItem;
177 begin
178         Result := 0;
179         for i := 0 to RoundList.Count[grtBoard] - 1 do begin
180                 RoundItem := RoundList.Items[i, grtBoard];
181                 if RoundItem.BoolData then
182                         Result := Result + 1;
183         end;
184         for i := 0 to RoundList.Count[grtItem] - 1 do begin
185                 RoundItem := RoundList.Items[i, grtItem];
186                 if RoundItem.BoolData then
187                         Result := Result + 1;
188         end;
189 end;
190
191 function TRoundDialog.CompareTime(Time1: TDateTime; Time2: TDateTime; MarginMin: Integer): Boolean;
192 const
193         AMin: Double = (1 / 24 / 60);
194 var
195         d: TDateTime;
196 begin
197         d := Time1 + (AMin * MarginMin);
198         Result := Time2 < d;
199 end;
200
201 procedure TRoundDialog.FormCreate(Sender: TObject);
202 var
203         i: Integer;
204     CenterForm: TCustomForm;
205 begin
206     CenterForm := TCustomForm(Owner);
207     if Assigned(CenterForm) then begin
208         Left := ((CenterForm.Width - Width) div 2) + CenterForm.Left;
209         Top := ((CenterForm.Height - Height) div 2) + CenterForm.Top;
210     end else begin
211         Left := (Screen.Width - Width) div 2;
212         Top := (Screen.Height - Height) div 2;
213     end;
214
215         //\8c»\8dÝ\82Ì\8f\84\89ñ\83f\81[\83^\82ð\83t\83@\83C\83\8b\83A\83E\83g\82·\82é
216         RoundList.SaveRoundFile;
217         RoundNameComboBox.Items.Add('\81i\82·\82×\82Ä\81j');
218         for i := 0 to RoundList.RoundNameList.Count - 1 do
219                 RoundNameComboBox.Items.Add(RoundList.RoundNameList[i]);
220         for i := 0 to RoundList.Count[grtBoard] - 1 do
221                 RoundList.Items[i, grtBoard].BoolData := False;
222         for i := 0 to RoundList.Count[grtItem] - 1 do
223                 RoundList.Items[i, grtItem].BoolData := False;
224         RoundNameComboBox.ItemIndex := 0;
225         SetRoundItem('');
226 end;
227
228 procedure TRoundDialog.RoundListViewChange(Sender: TObject;
229         Item: TListItem; Change: TItemChange);
230 var
231         RoundItem: TRoundItem;
232 begin
233         if TObject(Item.Data) is TRoundItem then begin
234                 RoundItem := TRoundItem(Item.Data);
235                 RoundItem.BoolData := Item.Checked;
236         end;
237 end;
238
239 procedure TRoundDialog.AllSelectButtonClick(Sender: TObject);
240 var
241         i: Integer;
242         RoundItem: TRoundItem;
243         ListChangeEvent: TLVChangeEvent;
244 begin
245         ListChangeEvent := RoundListView.OnChange;
246         RoundListView.OnChange := nil;
247         try
248                 for i := 0 to RoundListView.Items.Count - 1 do begin
249                         if TObject(RoundListView.Items[i].Data) is TRoundItem then begin
250                                 RoundItem := TRoundItem(RoundListView.Items[i].Data);
251                                 RoundItem.BoolData := True;
252                                 RoundListView.Items[i].Checked := True;
253                         end;
254                 end;
255         finally
256                 RoundListView.OnChange := ListChangeEvent;
257         end;
258 end;
259
260 procedure TRoundDialog.AllCancelButtonClick(Sender: TObject);
261 var
262         i: Integer;
263         RoundItem: TRoundItem;
264         ListChangeEvent: TLVChangeEvent;
265 begin
266         ListChangeEvent := RoundListView.OnChange;
267         RoundListView.OnChange := nil;
268         try
269                 for i := 0 to RoundListView.Items.Count - 1 do begin
270                         if TObject(RoundListView.Items[i].Data) is TRoundItem then begin
271                                 RoundItem := TRoundItem(RoundListView.Items[i].Data);
272                                 RoundItem.BoolData := False;
273                                 RoundListView.Items[i].Checked := False;
274                         end;
275                 end;
276         finally
277                 RoundListView.OnChange := ListChangeEvent;
278         end;
279 end;
280
281 procedure TRoundDialog.RoundNameComboBoxChange(Sender: TObject);
282 begin
283         //\83J\83\89\83\80\82Ì\83\\81[\83g\8bL\8d\86\83C\83\81\81[\83W\82ð\89ð\8f\9c\82·\82é
284         if FColumnToSort > -1 then
285                 RoundListView.Column[FColumnToSort].ImageIndex := -1;
286         FColumnToSort := -1;
287         if RoundNameComboBox.ItemIndex = 0 then
288                 SetRoundItem('')
289         else
290                 SetRoundItem(RoundNameComboBox.Items[RoundNameComboBox.itemIndex]);
291
292 end;
293
294 procedure TRoundDialog.SetRoundItem(RoundName: string);
295 var
296         ListItem: TListItem;
297         i: Integer;
298         ListChangeEvent: TLVChangeEvent;
299 begin
300         ListChangeEvent := RoundListView.OnChange;
301         RoundListView.OnChange := nil;
302         try
303                 RoundListView.Clear;
304                 for i := 0 to RoundList.Count[grtBoard] - 1 do begin
305                         if (RoundList.Items[i, grtBoard].RoundName = RoundName) or (RoundName = '') then begin
306                                 ListItem := RoundListView.Items.Add;
307                                 ListItem.Data := RoundList.Items[i, grtBoard];
308                                 ListItem.Caption := RoundList.Items[i, grtBoard].RoundName;
309                                 ListItem.SubItems.Add(RoundList.Items[i, grtBoard].BoardTitle);
310                                 ListItem.SubItems.Add('-');
311                                 ListItem.Checked := RoundList.Items[i, grtBoard].BoolData;
312                                 ListItem.ImageIndex := 0;
313                         end;
314                 end;
315                 for i := 0 to RoundList.Count[grtItem] - 1 do begin
316                         if (RoundList.Items[i, grtItem].RoundName = RoundName) or (RoundName = '') then begin
317                                 ListItem := RoundListView.Items.Add;
318                                 ListItem.Data := RoundList.Items[i, grtItem];
319                                 ListItem.Caption := RoundList.Items[i, grtItem].RoundName;
320                                 ListItem.SubItems.Add(RoundList.Items[i, grtItem].BoardTitle);
321                                 ListItem.SubItems.Add(RoundList.Items[i, grtItem].ThreadTitle);
322                                 ListItem.Checked := RoundList.Items[i, grtItem].BoolData;
323                                 ListItem.ImageIndex := 1;
324                         end;
325                 end;
326         finally
327                 RoundListView.OnChange := ListChangeEvent;
328         end;
329 end;
330
331 procedure TRoundDialog.RoundDeleteButtonClick(Sender: TObject);
332 var
333 //      Board: TBoard;
334 //      ThreadItem: TThreadItem;
335         RoundItem: TRoundItem;
336         ListChangeEvent: TLVChangeEvent;
337 begin
338         ListChangeEvent := RoundListView.OnChange;
339         RoundListView.OnChange := nil;
340         try
341                 if RoundListView.Selected = nil then
342                         Exit;
343                 if TObject(RoundListView.Selected.Data) is TRoundItem then begin
344                         RoundItem := TRoundItem(RoundListView.Selected.Data);
345                         if( RoundItem.Item is TBoard ) then begin
346                                 TBoard(RoundItem.Item).Round := false;
347                         end else if( RoundItem.Item is TThreadItem ) then begin
348                                 TThreadItem(RoundItem.Item).Round := false;
349                         end;
350                         //RoundList.Delete(RoundItem.URL,RoundItem.RoundType);
351                         {
352                         if RoundItem.RoundType = grtBoard then begin
353                                 //Board := TBoard( RoundItem.Item );
354                                 RoundList.Delete(RoundItem.URL,RoundItem.RoundType);
355                                 Board.Round := False;
356                                 Board.RoundName := '';
357                         end else begin
358                                 //ThreadItem := TThreadItem( RoundItem.Item );
359                                 RoundList.Delete(ThreadItem);
360                                 ThreadItem.Round := False;
361                                 ThreadItem.RoundName := '';
362                         end;
363                         }
364                         GikoForm.ListView.Refresh;
365                 end;
366                 RoundListView.Selected.Delete;
367         finally
368                 RoundListView.OnChange := ListChangeEvent;
369         end;
370 end;
371
372 procedure TRoundDialog.RoundListViewColumnClick(Sender: TObject;
373   Column: TListColumn);
374 begin
375         if (Sender is TCustomListView) then begin
376
377                 if FColumnToSort > -1 then
378                         (Sender as TCustomListView).Column[FColumnToSort].ImageIndex := -1;
379
380                 if FColumnToSort = Column.Index then
381                         FSortOrder := not FSortOrder
382                 else
383                         FSortOrder := false;
384
385                 if FSortOrder then
386                         Column.ImageIndex := 3
387                 else
388                         Column.ImageIndex := 2;
389
390                 FColumnToSort := Column.Index;
391                 (Sender as TCustomListView).AlphaSort;
392         end;
393 end;
394
395 procedure TRoundDialog.RoundListViewCompare(Sender: TObject; Item1,
396   Item2: TListItem; Data: Integer; var Compare: Integer);
397 var
398   ix: Integer;
399 begin
400         if FColumnToSort = 0 then begin
401                 if not FSortOrder then begin
402                         Compare := CompareText(Item1.Caption,Item2.Caption);
403                         if Compare = 0 then
404                                 Compare := CompareValue(Item1.ImageIndex, item2.ImageIndex);
405                 end else begin
406                         Compare := -CompareText(Item1.Caption,Item2.Caption);
407                         if Compare = 0 then
408                                 Compare := -CompareValue(Item1.ImageIndex,item2.ImageIndex);
409                 end;
410         end else begin
411                 ix := FColumnToSort - 1;
412                 if not FSortOrder then begin
413                         Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
414                         if Compare = 0 then
415                                 Compare := CompareValue(Item1.ImageIndex, item2.ImageIndex);
416                 end else begin
417                         Compare := -CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
418                         if Compare = 0 then
419                                 Compare := -CompareValue(Item1.ImageIndex, item2.ImageIndex);
420                 end;
421         end;
422 end;
423 (*
424\83J\83\89\83\80\8fã\82Å\89E\83N\83\8a\83b\83N\82µ\82½\82ç\83\\81[\83g\82ð\89ð\8f\9c\82µ\82Ä\8f\89\8aú\8fó\91Ô\82É\96ß\82·
425 *)
426 procedure TRoundDialog.RoundListViewColumnRightClick(Sender: TObject;
427   Column: TListColumn; Point: TPoint);
428 begin
429         RoundNameComboBox.OnChange(Sender);
430 end;
431
432 end.