📄 umain.pas
字号:
procedure TMainWindow.LoadFavToTree(aNode:TcxTreeListNode;oln:TOutlineType);
var i:Integer;
tnode:TcxTreeListNode;
favitem:Tfavitem;
otl:TOutlineType;
begin
for i := 0 to oln.Items.Count - 1 do // Iterate
begin
otl:=oln.Items.Item[i];
favitem:=FavList.Add(otl);
tnode:=FeedTree.AddChild(aNode , favitem );
tnode.Texts[0]:=otl.Title;
favitem.TreeNode:=tnode;
if otl.Type_<>'folder' then
begin
favitem.Rss.OnItemChange := Event_FavItemsChange;
favitem.Rss.ExecItemChanged;
end;
if otl.hasChild then
LoadFavToTree(tnode,otl);
end; // for
end;
procedure TMainWindow.LoadOPMLFile;
var i:Integer;
resStream:TResourceStream;
tnode:TcxTreeListNode;
feeditem:TFeedItem;
otl:TOutlineType;
begin
ChannelNode := FeedTree.AddChild(nil);
ChannelNode.Texts[0]:='Channel';
ChannelNode.ImageIndex:=0;
ChannelNode.SelectedIndex:=0;
if not FileExists(gProperties.AppPath+FeedOpmlFile) then
begin
resStream:=TResourceStream.Create(HInstance, 'OPMLXML', 'XML');
try
resStream.SaveToFile(gProperties.AppPath+FeedOpmlFile);
finally
resStream.Free;
end;
end;
FeedList:=TFeed.Create(self);
Opml := Loadopml(gProperties.AppPath+FeedOpmlFile);
for i := 0 to Opml.Body.Items.Count - 1 do // Iterate
begin
otl:=Opml.Body.Items.Item[i];
feeditem:=FeedList.Add(otl);
tnode:=FeedTree.AddChild(ChannelNode , feeditem );
tnode.Texts[0]:=otl.Title ;
feeditem.TreeNode:=tnode;
if otl.Type_<>'folder' then
begin //设置响应的事件
feeditem.Rss.OnItemChange := Event_ItemsChange;
feeditem.OnNewItem := Event_OnNewItem;
feeditem.Rss.ExecItemChanged;
end;
if otl.hasChild then
LoadToTree(tnode,otl);
end; // for
ChannelNode.Expand(False);
end;
procedure TMainWindow.LoadFavOPMLFile;
var i:Integer;
resStream:TResourceStream;
tnode:TcxTreeListNode;
favItem:TFavItem;
otl:TOutlineType;
begin
FavoritesNode := FeedTree.AddChild(nil);
FavoritesNode.Texts[0]:='Favorites';
FavoritesNode.ImageIndex:=7;
FavoritesNode.SelectedIndex:=7;
SearchNode := FeedTree.AddChild(nil);
SearchNode.Texts[0]:='Search';
SearchNode.ImageIndex:=5;
SearchNode.SelectedIndex:=5;
if not FileExists(gProperties.AppPath+FavOpmlFile) then
begin
resStream:=TResourceStream.Create(HInstance, 'OPMLXML', 'XML');
try
resStream.SaveToFile(gProperties.AppPath+FavOpmlFile);
finally
resStream.Free;
end;
end;
FavList:=TFavorite.Create(self);
FavOpml := Loadopml(gProperties.AppPath+FavOpmlFile);
FavOpml.Head.Title:= 'RssNavigator Favorite';
for i := 0 to FavOpml.Body.Items.Count - 1 do // Iterate
begin
otl:=FavOpml.Body.Items.Item[i];
favItem:=FavList.Add(otl);
tnode:=FeedTree.AddChild(FavoritesNode , favItem );
tnode.Texts[0]:=otl.Title ;
favItem.TreeNode:=tnode;
if otl.Type_<>'folder' then
begin
favItem.Rss.OnItemChange := Event_FavItemsChange;
favItem.Rss.ExecItemChanged;
end;
if otl.hasChild then
LoadFavToTree(tnode,otl);
end; // for
//CalculateFolderReadedCount(FavoritesNode);
FavoritesNode.Expand(False);
end;
procedure TMainWindow.JvStatusBar1Resize(Sender: TObject);
begin
jvStatusBar1.Panels[0].Width:=jvStatusBar1.Width-JvStatusBar1.Panels[1].Width-JvStatusBar1.Panels[2].Width
-JvStatusBar1.Panels[3].Width - 6;
ProgressBar.Left:=JvStatusBar1.Panels[0].Width+2;
end;
procedure TMainWindow.DesktopAlterMessageClick(Sender:TObject);
var TmpNode,node:TcxTreeListNode;
begin
node := TcxTreeListNode((Sender as TJvDesktopAlert).Data);
TmpNode:=Node;
while TmpNode.Parent<>nil do
begin
TmpNode.Parent.Expand(False);
TmpNode := TmpNode.Parent;
end; // while
FeedTree.SetFocusedNode(node,[]);
TrayIcon.ShowMainForm;
end;
procedure TMainWindow.Event_ShowDesktopAlert(ANode:TcxTreeListNode;AMessageText:string);
var Alert:TJvDesktopAlert;
begin
Alert:=TJvDesktopAlert.Create(nil);
Alert.MessageText := AMessageText;
Alert.Data := ANode;
Alert.HeaderText := 'News';
Alert.Location.Height := 60;
Alert.StyleOptions.DisplayDuration := 4000;
Alert.AutoFree := True;
Alert.OnMessageClick := DesktopAlterMessageClick;
Alert.Execute;
end;
procedure TMainWindow.Event_UpdateDone(Sender: TObject; const ContentType: string; FileSize: Integer; Stream: TStream);
var fItem:TFeedItem;
begin
fItem := TFeedItem(TWinHTTP(Sender).Owner);
fItem.TreeNode.ImageIndex:=2;
fItem.TreeNode.SelectedIndex:=2;
end;
procedure TMainWindow.Event_UpdateProgress(Sender: TObject; const ContentType: string;
FileSize, BytesRead, PercentsDone: Integer);
begin
OnProgress(Sender,PercentsDone,100);
FeedTree.Refresh;
end;
procedure TMainWindow.Event_Error(Sender: TObject; ErrorStr: string);
begin
TFeedItem(TWinHTTP(Sender).Owner).TreeNode.ImageIndex:=3;
TFeedItem(TWinHTTP(Sender).Owner).TreeNode.SelectedIndex:=3;
end;
procedure TMainwindow.CalculateFolderReadedCount(aNode:TcxTreeListNode);
var
i,Readed,Unreaded:Integer;
cnode:TcxTreeListNode;
begin
Readed := 0; Unreaded := 0;
for i:= 0 to aNode.Count - 1 do // Iterate
begin
cnode := aNode.Items[i];
if cnode.HasChildren then
CalculateFolderReadedCount(cnode);
if cnode.Texts[1]='' then cnode.Values[1] :=0;
if cnode.Texts[2]='' then cnode.Values[2] :=0;
Readed := Readed + cnode.Values[1];
UnReaded := UnReaded + cnode.Values[2];
end; // for
aNode.Values[1] := Readed;
aNode.Values[2] := UnReaded;
end;
procedure TMainwindow.Event_ItemsChange(Sender: TObject);
var feedItem:TFeedItem;
begin
feedItem:=TFeedItem(TLocalRssFeed(Sender).Owner);
feedItem.TreeNode.Texts[0] := feedItem.Outline.Title;
feedItem.TreeNode.Texts[1] := IntToStr(feedItem.Rss.Items.UnreadCount);
feedItem.TreeNode.Texts[2] := IntToStr(feedItem.Rss.Items.Count);
CalculateFolderReadedCount(ChannelNode);
end;
procedure TMainwindow.Event_FavItemsChange(Sender: TObject);
var favItem:TFavItem;
begin
favItem:=TFavItem(TLocalRssFeed(Sender).Owner);
favItem.TreeNode.Texts[0] := favItem.Outline.Title;
favItem.TreeNode.Texts[1] := IntToStr(favItem.Rss.Items.UnreadCount);
favItem.TreeNode.Texts[2] := IntToStr(favItem.Rss.Items.Count);
CalculateFolderReadedCount(FavoritesNode);
end;
procedure TMainwindow.Event_OnNewItem(Sender:TObject;Item:TLocalRssItem);
begin
cxTreeList1.ClearSorting;
if (Sender as TFeedItem).TreeNode=FeedTree.FocusedNode then
begin
with cxTreeList1.Add do
begin
Data := Item;
Values[0]:=Item.Readed;
Values[1]:=Item.Flag;
Texts[2]:=Item.Title;
Texts[3]:=Item.Author;
Texts[4]:=Item.PubDate.ToString;
Texts[5]:=Item.Category;
Texts[6]:=Item.ReceivedDate.ToString;
Texts[7]:=ExtractNonHTML(Item.Description);
end;
end;
end;
procedure TMainWindow.TimerAutoReadedTimer(Sender: TObject);
var RssItem:TLocalRssItem;
begin
if cxTreeList1.FocusedNode = nil then
Exit;
RssItem:=TLocalRssItem(cxTreeList1.FocusedNode.Data);
if RssItem<>nil then
begin
RssItem.Readed:=True;
cxTreeList1.FocusedNode.Values[0]:=True;
end;
TLocalRssFeed(RssItem.Owner.Owner).ExecItemChanged;
TimerAutoReaded.Enabled:=False;
actMakeUnRead.Update;
actMakeRead.Update;
end;
procedure TMainWindow.UpdateWithChild(aNode:TcxTreeListNode);
var
i:Integer;
FeedItem:TFeedItem;
begin
if aNode.HasChildren then
begin
for i := 0 to aNode.Count - 1 do // Iterate
UpdateWithChild(aNode.Items[i]);
end
else
begin
if (aNode.Level>0) and (GetRootNode(aNode)=ChannelNode) then
begin
FeedItem := TFeedItem(aNode.Data);
if FeedItem.Outline.Type_<>'folder' then
begin
FeedItem.OnHttpProgress:=Event_UpdateProgress;
FeedItem.OnHttpDone := Event_UpdateDone;
FeedItem.OnError := Event_Error;
FeedItem.OnNewItem := Event_OnNewItem;
FeedItem.StartUpdate;
end;
end;
end;
end;
procedure TMainWindow.MakeNewsPaper(AFocusedNode:TcxTreeListNode);
var HTML:string;
begin
if AFocusedNode=nil then
Exit;
HTMLXml.loadXML(TFeedItem(AFocusedNode.Data).Rss.XML);
HTML:=HTMLXml.transformNode(XSL.documentElement);
HTML:=FastReplace(HTML,'<META http-equiv="Content-Type" content="text/html; charset=utf-16">','');
HTML := FastReplace(HTML,'$ImagesFolder$',gProperties.AppPath+'Styles\Images\');
HTML := FastReplace(HTML,ToDayStr,'<b>Today</b>');
HTML := FastReplace(HTML,YestoDayStr,'<b>Yestoday</b>');
ShowHtmlInBrowser(HTML);
end;
function TMainWindow.ApplyFilter(AItem:TLocalRssItem):Boolean;
var OK2:Boolean;
begin
Result := False;
OK2 := False;
case FilterBox.ItemIndex of //
0: Result := true;
1: Result := AItem.Flag>0;
2: Result := AItem.Readed=True;
3: Result := AItem.Readed=False;
end; // case
case DateFilterBox.ItemIndex of //
0: OK2 := True;
1: OK2 := AItem.PubDate.isToDay;
2: OK2 := AItem.PubDate.isYestoday;
end; // case
Result := Result and OK2;
end;
procedure TMainWindow.ReloadRssItems(AFocusedNode:TcxTreeListNode);
var
node:TcxTreeListNode;
Feeds:TFeedItem;
i:Integer;
begin
node:=AFocusedNode;
if (node<>nil)then
begin
Feeds:=TFeedItem(Node.Data);
SetCaption('RssNavigator - '+ Feeds.Outline.Title);
//Self.Caption:='NewsRambler - '+ Feeds.Outline.Title;
cxTreeList1.Clear;
cxTreeList1.BeginUpdate;
cxTreeList1.Preview.Visible := False;
for i:= 0 to Feeds.Rss.Items.Count - 1 do // Iterate
begin
if (not Feeds.Rss.Items.Item[i].Delete) and (ApplyFilter(Feeds.Rss.Items.Item[i])) then
with cxTreeList1.Add do
begin
Data:=TLocalRssItem(Feeds.Rss.Items.Item[i]);
Values[0]:=Feeds.Rss.Items.Item[i].Readed;
Values[1]:=Feeds.Rss.Items.Item[i].Flag;
Texts[2]:=Feeds.Rss.Items.Item[i].Title;
Texts[3]:=Feeds.Rss.Items.Item[i].Author;
Texts[4]:=Feeds.Rss.Items.Item[i].PubDate.ToString;
Texts[5]:=Feeds.Rss.Items.Item[i].Category;
Texts[6]:=Feeds.Rss.Items.Item[i].ReceivedDate.ToString;
Texts[7]:=ExtractNonHTML(Feeds.Rss.Items.Item[i].Description);
{for j := 2 to 5 do
begin
if Texts[j]='' then
Texts[j]:='<Null>';
end; }
end; // with
//cxTreeList1.refresh;
end; // for
cxTreeList1.Preview.Visible := gProperties.ShowPerview;
cxTreeList1.EndUpdate;
end;
end;
procedure TMainWindow.ReloadFavRssItems(AFocusedNode:TcxTreeListNode);
var
node:TcxTreeListNode;
Fav:TFavItem;
i:Integer;
begin
node:=AFocusedNode;
if (node<>nil)then
begin
Fav:=TFavItem(Node.Data);
SetCaption('RssNavigator - '+ Fav.Outline.Title);
//Self.Caption:='NewsRambler - '+ Fav.Outline.Title;
cxTreeList1.Clear;
cxTreeList1.BeginUpdate;
cxTreeList1.Preview.Visible := False;
for i:= 0 to Fav.Rss.Items.Count - 1 do // Iterate
begin
if not Fav.Rss.Items.Item[i].Delete then
with cxTreeList1.Add do
begin
Data:=TLocalRssItem(Fav.Rss.Items.Item[i]);
Values[0]:=Fav.Rss.Items.Item[i].Readed;
Values[1]:=Fav.Rss.Items.Item[i].Flag;
Texts[2]:=Fav.Rss.Items.Item[i].Title;
Texts[3]:=Fav.Rss.Items.Item[i].Author;
Texts[4]:=Fav.Rss.Items.Item[i].PubDate.ToString;
Texts[5]:=Fav.Rss.Items.Item[i].Category;
Texts[6]:=Fav.Rss.Items.Item[i].ReceivedDate.ToString;
Texts[7]:=ExtractNonHTML(Fav.Rss.Items.Item[i].Description);
end;
//cxTreeList1.refresh;
end;
cxTreeList1.Preview.Visible := gProperties.ShowPerview;
cxTreeList1.EndUpdate;
end;
end;
procedure TMainWindow.ShowFolderContent(AFocusedNode:TcxTreeListNode);
var sitem:TFeedItem;
Html:WideString;
i:Integer;
img:string;
begin
cxTreeList1.Clear;
Html :='';
Html := '<HTML><HEAD><STYLE>BODY{FONT-SIZE:9PT;FONT-FAMILY:TAHOMA,VERDANA,ARIAL;}img{border:0}</STYLE></HEAD><BODY>';
Html := Html+'<B>'+AFocusedNode.Texts[0] +'</B><BR>';
HTML := Html+'<div style=''border:none;border-bottom:solid windowtext 1.0pt;mso-border-bottom-alt:solid windowtext .75pt;padding:0cm 0cm 1.0pt 0cm''></div>';
if AFocusedNode.Level>0 then
HTML := Html + '<A href="javascript:window.external.SelectParentNode()"><img src="$ImagesFolder$folder.gif"> ..</A><BR>';
for i := 0 to AFocusedNode.Count - 1 do // Iterate
begin
sitem := TFeedItem(AFocusedNode.Items[i].Data);
if sitem.Outline.Type_='folder' then
img := 'folder.gif'
else
img := 'snippet.gif';
HTML := Html+'<A href="javascript:window.external.SelectSubNode('+IntToStr(i)+')"><img src="$ImagesFolder$'+img+'">';
HTML := Html+AFocusedNode.Items[i].Texts[0]+'</A><BR>';
end; // for
HTML := Html+'</BODY></HTML>' ;
HTML := FastReplace(Html,'$ImagesFolder$',gProperties.AppPath+'Styles\Images\',False);
ShowHtmlInBrowser(Html);
end;
procedure TMainWindow.AddressBoxKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -