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         private
44                 { Private \90é\8c¾ }
45                 FColumnToSort: Integer;
46                 FSortOrder:     Boolean;
47                 function GetRoundCount: Integer;
48                 procedure SetRoundItem(RoundName: string);
49                 function CompareTime(Time1: TDateTime; Time2: TDateTime; MarginMin: Integer): Boolean;
50         public
51                 { Public \90é\8c¾ }
52         end;
53
54 //var
55 //      RoundDialog: TRoundDialog;
56
57 implementation
58
59 uses
60         Giko, BoardGroup, RoundData, Math;
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 CompareTime(GikoForm.LastRoundTime, Now, 5) then begin
74 //              msg := '\88ê\93x\8f\84\89ñ\82·\82é\82Æ\82T\95ª\8aÔ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ';
75 //              GikoSys.MsgBox(msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
76 //              Exit;
77 //      end;
78 {$IF Defined(FRCRND) }
79     Giko.GikoForm.LoginAction.Checked := true; // \93®\8dì\8e\8e\8c±\97p\93r
80 {$IFEND}
81
82         if not Giko.GikoForm.LoginAction.Checked then begin 
83                 if GikoSys.Setting.UserID <> '' then begin 
84                         msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ' + #13#10 
85                                 + '\8d¡\83\8d\83O\83C\83\93\82µ\82Ü\82·\82©'; 
86                         if MsgBox(Handle, msg, '\8am\94F', MB_YESNO or MB_ICONQUESTION or MB_DEFBUTTON2) <> IDYES then begin 
87                                 Exit; 
88                         end; 
89                         Giko.GikoForm.LoginAction.Execute; 
90                 end; 
91         end;
92
93         if not Giko.GikoForm.LoginAction.Checked then begin
94                 msg := '\83\8d\83O\83C\83\93\82µ\82È\82¢\82Æ\8f\84\89ñ\82Í\8fo\97\88\82Ü\82¹\82ñ';// + #13#10
95 //                               + '\95ª\82©\82ç\82È\82¢\90l\82Í\83M\83R\83i\83r\83X\83\8c\83b\83h\82Å\95·\82¢\82Ä\82­\82¾\82³\82¢';
96                 MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
97                 Exit;
98         end;
99
100         cnt := GetRoundCount;
101         if cnt = 0 then begin
102                 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¢';
103                 MsgBox(Handle, msg, '\83G\83\89\81[', MB_OK or MB_ICONSTOP);
104                 Exit;
105         end;
106
107         for i := 0 to RoundList.Count[grtBoard] - 1 do begin
108                 RoundItem := RoundList.Items[i, grtBoard];
109                 if not RoundItem.BoolData then Continue;
110                 if not Giko.GikoForm.LoginAction.Checked then Exit;
111                 if RoundItem.RoundType = grtBoard then begin
112                         //Board := TBoard( RoundItem.Item );
113             Board := BBSsFindBoardFromURL(RoundItem.URL);
114                         if Board <> nil then begin
115                                 if not Board.IsThreadDatRead then
116                                         GikoSys.ReadSubjectFile(Board);
117                                 GikoForm.DownloadList(Board);
118                         end;
119                 end;
120         end;
121         for i := 0 to RoundList.Count[grtItem] - 1 do begin
122                 RoundItem := RoundList.Items[i, grtItem];
123                 if not RoundItem.BoolData then Continue;
124                 if not Giko.GikoForm.LoginAction.Checked then Exit;
125     if RoundItem.RoundType = grtItem then begin
126         //ThreadItem := TThreadItem( RoundItem.Item );
127         ThreadItem := BBSsFindThreadFromURL(RoundItem.URL);
128                         if ThreadItem <> nil then begin
129 //                              GikoForm.AddMessageList('debug2:' + IntToStr(i), nil);
130                                 GikoForm.DownloadContent(ThreadItem);
131                         end;
132                 end;
133         end;
134 //      GikoForm.LastRoundTime := Now;
135         Close;
136 end;
137
138 function TRoundDialog.GetRoundCount: Integer;
139 var
140         i: Integer;
141         RoundItem: TRoundItem;
142 begin
143         Result := 0;
144         for i := 0 to RoundList.Count[grtBoard] - 1 do begin
145                 RoundItem := RoundList.Items[i, grtBoard];
146                 if RoundItem.BoolData then
147                         Result := Result + 1;
148         end;
149         for i := 0 to RoundList.Count[grtItem] - 1 do begin
150                 RoundItem := RoundList.Items[i, grtItem];
151                 if RoundItem.BoolData then
152                         Result := Result + 1;
153         end;
154 end;
155
156 function TRoundDialog.CompareTime(Time1: TDateTime; Time2: TDateTime; MarginMin: Integer): Boolean;
157 const
158         AMin: Double = (1 / 24 / 60);
159 var
160         d: TDateTime;
161 begin
162         d := Time1 + (AMin * MarginMin);
163         Result := Time2 < d;
164 end;
165
166 procedure TRoundDialog.FormCreate(Sender: TObject);
167 var
168         i: Integer;
169 begin
170     FColumnToSort := -1;
171         RoundNameComboBox.Items.Add('\81i\82·\82×\82Ä\81j');
172         for i := 0 to RoundList.RoundNameList.Count - 1 do
173                 RoundNameComboBox.Items.Add(RoundList.RoundNameList[i]);
174         for i := 0 to RoundList.Count[grtBoard] - 1 do
175                 RoundList.Items[i, grtBoard].BoolData := False;
176         for i := 0 to RoundList.Count[grtItem] - 1 do
177                 RoundList.Items[i, grtItem].BoolData := False;
178         RoundNameComboBox.ItemIndex := 0;
179         SetRoundItem('');
180 end;
181
182 procedure TRoundDialog.RoundListViewChange(Sender: TObject;
183         Item: TListItem; Change: TItemChange);
184 var
185         RoundItem: TRoundItem;
186 begin
187         if TObject(Item.Data) is TRoundItem then begin
188                 RoundItem := TRoundItem(Item.Data);
189                 RoundItem.BoolData := Item.Checked;
190         end;
191 end;
192
193 procedure TRoundDialog.AllSelectButtonClick(Sender: TObject);
194 var
195         i: Integer;
196         RoundItem: TRoundItem;
197         ListChangeEvent: TLVChangeEvent;
198 begin
199         ListChangeEvent := RoundListView.OnChange;
200         RoundListView.OnChange := nil;
201         try
202                 for i := 0 to RoundListView.Items.Count - 1 do begin
203                         if TObject(RoundListView.Items[i].Data) is TRoundItem then begin
204                                 RoundItem := TRoundItem(RoundListView.Items[i].Data);
205                                 RoundItem.BoolData := True;
206                                 RoundListView.Items[i].Checked := True;
207                         end;
208                 end;
209         finally
210                 RoundListView.OnChange := ListChangeEvent;
211         end;
212 end;
213
214 procedure TRoundDialog.AllCancelButtonClick(Sender: TObject);
215 var
216         i: Integer;
217         RoundItem: TRoundItem;
218         ListChangeEvent: TLVChangeEvent;
219 begin
220         ListChangeEvent := RoundListView.OnChange;
221         RoundListView.OnChange := nil;
222         try
223                 for i := 0 to RoundListView.Items.Count - 1 do begin
224                         if TObject(RoundListView.Items[i].Data) is TRoundItem then begin
225                                 RoundItem := TRoundItem(RoundListView.Items[i].Data);
226                                 RoundItem.BoolData := False;
227                                 RoundListView.Items[i].Checked := False;
228                         end;
229                 end;
230         finally
231                 RoundListView.OnChange := ListChangeEvent;
232         end;
233 end;
234
235 procedure TRoundDialog.RoundNameComboBoxChange(Sender: TObject);
236 begin
237         if RoundNameComboBox.ItemIndex = 0 then
238                 SetRoundItem('')
239         else
240                 SetRoundItem(RoundNameComboBox.Items[RoundNameComboBox.itemIndex]);
241 end;
242
243 procedure TRoundDialog.SetRoundItem(RoundName: string);
244 var
245         ListItem: TListItem;
246         i: Integer;
247         ListChangeEvent: TLVChangeEvent;
248 begin
249         ListChangeEvent := RoundListView.OnChange;
250         RoundListView.OnChange := nil;
251         try
252                 RoundListView.Clear;
253                 for i := 0 to RoundList.Count[grtBoard] - 1 do begin
254                         if (RoundList.Items[i, grtBoard].RoundName = RoundName) or (RoundName = '') then begin
255                                 ListItem := RoundListView.Items.Add;
256                                 ListItem.Data := RoundList.Items[i, grtBoard];
257                                 ListItem.Caption := RoundList.Items[i, grtBoard].RoundName;
258                                 ListItem.SubItems.Add(RoundList.Items[i, grtBoard].BoardTitle);
259                                 ListItem.SubItems.Add('-');
260                                 ListItem.Checked := RoundList.Items[i, grtBoard].BoolData;
261                                 ListItem.ImageIndex := 0;
262                         end;
263                 end;
264                 for i := 0 to RoundList.Count[grtItem] - 1 do begin
265                         if (RoundList.Items[i, grtItem].RoundName = RoundName) or (RoundName = '') then begin
266                                 ListItem := RoundListView.Items.Add;
267                                 ListItem.Data := RoundList.Items[i, grtItem];
268                                 ListItem.Caption := RoundList.Items[i, grtItem].RoundName;
269                                 ListItem.SubItems.Add(RoundList.Items[i, grtItem].BoardTitle);
270                                 ListItem.SubItems.Add(RoundList.Items[i, grtItem].ThreadTitle);
271                                 ListItem.Checked := RoundList.Items[i, grtItem].BoolData;
272                                 ListItem.ImageIndex := 1;
273                         end;
274                 end;
275         finally
276                 RoundListView.OnChange := ListChangeEvent;
277         end;
278 end;
279
280 procedure TRoundDialog.RoundDeleteButtonClick(Sender: TObject);
281 var
282 //      Board: TBoard;
283 //      ThreadItem: TThreadItem;
284         RoundItem: TRoundItem;
285         ListChangeEvent: TLVChangeEvent;
286 begin
287         ListChangeEvent := RoundListView.OnChange;
288         RoundListView.OnChange := nil;
289         try
290                 if RoundListView.Selected = nil then
291                         Exit;
292                 if TObject(RoundListView.Selected.Data) is TRoundItem then begin
293                         RoundItem := TRoundItem(RoundListView.Selected.Data);
294             RoundList.Delete(RoundItem.URL,RoundItem.RoundType);
295             {
296                         if RoundItem.RoundType = grtBoard then begin
297                                 //Board := TBoard( RoundItem.Item );
298                                 RoundList.Delete(RoundItem.URL,RoundItem.RoundType);
299                                 Board.Round := False;
300                                 Board.RoundName := '';
301                         end else begin
302                                 //ThreadItem := TThreadItem( RoundItem.Item );
303                                 RoundList.Delete(ThreadItem);
304                                 ThreadItem.Round := False;
305                                 ThreadItem.RoundName := '';
306                         end;
307             }
308                         GikoForm.ListView.Refresh;
309                 end;
310                 RoundListView.Selected.Delete;
311         finally
312                 RoundListView.OnChange := ListChangeEvent;
313         end;
314 end;
315
316 procedure TRoundDialog.RoundListViewColumnClick(Sender: TObject;
317   Column: TListColumn);
318 begin
319         if FColumnToSort > -1 then
320                 (Sender as TCustomListView).Column[FColumnToSort].ImageIndex := -1;
321
322         if FColumnToSort = Column.Index then
323                 FSortOrder := not FSortOrder
324         else
325                 FSortOrder := false;
326
327         if FSortOrder then
328                 Column.ImageIndex := 3
329         else
330                 Column.ImageIndex := 2;
331
332         FColumnToSort := Column.Index;
333         (Sender as TCustomListView).AlphaSort;
334 end;
335
336 procedure TRoundDialog.RoundListViewCompare(Sender: TObject; Item1,
337   Item2: TListItem; Data: Integer; var Compare: Integer);
338 var
339   ix: Integer;
340 begin
341         if FColumnToSort = 0 then begin
342                 if not FSortOrder then begin
343                         Compare := CompareText(Item1.Caption,Item2.Caption);
344                         if Compare = 0 then
345                                 Compare := CompareValue(Item1.ImageIndex, item2.ImageIndex);
346                 end else begin
347                         Compare := -CompareText(Item1.Caption,Item2.Caption);
348                         if Compare = 0 then
349                                 Compare := -CompareValue(Item1.ImageIndex,item2.ImageIndex);
350                 end;
351         end else begin
352                 ix := FColumnToSort - 1;
353                 if not FSortOrder then begin
354                         Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
355                         if Compare = 0 then
356                                 Compare := CompareValue(Item1.ImageIndex, item2.ImageIndex);
357                 end else begin
358                         Compare := -CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
359                         if Compare = 0 then
360                                 Compare := -CompareValue(Item1.ImageIndex, item2.ImageIndex);
361                 end;
362         end;
363 end;
364
365 end.