⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umain.pas

📁 自己写的一个 RSS 阅读器
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -