OSDN Git Service

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