diff --git a/Classes/Category.java b/Classes/Category.java
index d5a2cf8..f910b19 100644
--- a/Classes/Category.java
+++ b/Classes/Category.java
@@ -1,5 +1,25 @@
package Classes;
public enum Category {
- business, entertainment, gaming, general, healthAndMedical, music, politics, scienceAndNature, sport, technology, all
+// business, entertainment, gaming, general, healthAndMedical, music, politics, scienceAndNature, sport, technology, all
+
+ all("all", "black"),
+ business("business", "red"),
+ entertainment("entertainment", "skyblue"),
+ gaming("gaming", "green"),
+ health("health", "yellow"),
+ music("music", "purple"),
+ sport("sport", "brown"),
+ science("science", "#f14405"),
+ nature("nature", "#16c668"),
+ economics("economics", "#d1991b"),
+ politics("politics", "#6825f4"),
+ technology("technology", "#1e7ebe");
+
+ protected String color;
+ protected String label;
+ Category(String label, String color){ this.label = label; this.color = color; }
+
+ public String getLabel(){ return this.label; }
+ public String getColor(){ return this.color; }
}
diff --git a/Classes/css/user/ArticleStylesheet.java b/Classes/css/user/ArticleStylesheet.java
new file mode 100644
index 0000000..7303694
--- /dev/null
+++ b/Classes/css/user/ArticleStylesheet.java
@@ -0,0 +1,142 @@
+package Classes.css.user;
+
+import java.util.ArrayList;
+
+import Classes.css.core.Context;
+import Classes.css.core.Ruleset;
+import javafx.scene.Node;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.Pane;
+import javafx.scene.text.Text;
+
+public class ArticleStylesheet{
+
+ /* Builds all necessary CSS/layout rules */
+ public ArticleStylesheet(Node target) throws Exception{
+
+ /* (1) Useful cast */
+ AnchorPane _target = (AnchorPane) target;
+ HBox _hc = (HBox) _target.getChildren().get(3);
+
+ /* (2) Set rules for parent */
+ Ruleset.load(_target)
+
+ .add("min-width", Context.getInt("article-width"))
+ .add("max-width", Context.getInt("article-width"))
+
+ .add("min-height", Context.getInt("article-height"))
+ .add("max-height", Context.getInt("article-height"))
+
+ .add("pref-width", Context.getString("article-width"))
+ .add("pref-height", Context.getString("article-height"))
+
+ // border
+ .add("border-insets", "10")
+ .add("border-radius", "3")
+ .add("border-color", "#ddd")
+
+ // bg
+ .add("background-insets", "10")
+ .add("background-radius", "3")
+ .add("background-color", "#fff")
+ .apply();
+
+ /* (2) Get children ruleset: picture, content, date, header_container */
+ this.Picture( (ImageView) _target.getChildren().get(0) ).apply();
+ this.Content( (Text) _target.getChildren().get(1) ).apply();
+ this.RelativeDate( (Text) _target.getChildren().get(2) ).apply();
+ this.HeaderContainer( (HBox) _target.getChildren().get(3) ).apply();
+
+ /* (3) Header container children: title, tag1, tag2, ... */
+ this.HeaderTitle( (Text) _hc.getChildren().get(0) ).apply();
+
+ for( int i = 0 ; i < _hc.getChildren().size()-1 ; i++ ){
+
+ Pane _tmp = (Pane) _hc.getChildren().get(i+1);
+ this.HeaderTag(_tmp).apply();
+ this.HeaderTextTag( (Text) _tmp.getChildren().get(0) ).apply();
+
+ }
+
+ }
+
+
+
+
+ /* Picture of article */
+ private Ruleset Picture(ImageView target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("top", 20)
+ .add("left", 20)
+ .add("bottom", 20);
+
+ }
+
+ /* Article content */
+ private Ruleset Content(Text target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("top", 50)
+ .add("left", 96)
+ .add("fill", "#808080")
+ .add("font-family", "Lato Regular")
+ .add("font-size", "12");
+
+ }
+
+ /* Header Container */
+ private Ruleset HeaderContainer(HBox target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("top", 20)
+ .add("left", 96)
+ .add("pref-height", "21")
+ .add("pref-width", "200");
+
+ }
+
+ /* Relative date of article */
+ private Ruleset RelativeDate(Text target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("top", 20)
+ .add("right", 20)
+ .add("fill", "#757575")
+ .add("font-family", "Lato Bold")
+ .add("font-size", "12");
+ }
+
+ /* Header Title */
+ private Ruleset HeaderTitle(Text target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("font-family", "Lato Bold")
+ .add("font-size", "17");
+
+ }
+
+ /* Header Tag */
+ private Ruleset HeaderTag(Pane target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("pref-width", 55)
+ .add("pref-height", 20)
+ .add("background-color", "#f8b02c")
+ .add("background-radius", "3");
+
+ }
+
+ /* Header Tag Text */
+ private Ruleset HeaderTextTag(Text target) throws Exception{
+
+ return Ruleset.load(target)
+ .add("fill", "#fff")
+ .add("font-family", "Lato Regular")
+ .add("font-size", "14");
+
+ }
+
+}
diff --git a/Classes/css/user/ContextBuilder.java b/Classes/css/user/ContextBuilder.java
index 059b9a7..85111b0 100644
--- a/Classes/css/user/ContextBuilder.java
+++ b/Classes/css/user/ContextBuilder.java
@@ -14,6 +14,8 @@ public class ContextBuilder{
Context.bind("header-height", 50);
Context.bind("menu-width", 237);
Context.bind("submenu-width", 200);
+ Context.bind("article-width", 800);
+ Context.bind("article-height", 96);
/* (3) Colors */
Context.bind("main-color", 63, 81, 181);
diff --git a/Classes/css/user/SubMenuStyleSheet.java b/Classes/css/user/SubMenuStyleSheet.java
index c0f27f7..16bdd8e 100644
--- a/Classes/css/user/SubMenuStyleSheet.java
+++ b/Classes/css/user/SubMenuStyleSheet.java
@@ -12,7 +12,7 @@ public class SubMenuStyleSheet{
/* (1) Set rules */
Ruleset.load(target)
.add("top", Context.getInt("header-height"))
- .add("left", Context.getInt("menu-width"))
+ .add("left", Context.getInt("menu-width")-3)
.add("bottom", 0)
.add("min-width", Context.getInt("submenu-width"))
diff --git a/controller/Article.java b/controller/Article.java
new file mode 100644
index 0000000..45fcb57
--- /dev/null
+++ b/controller/Article.java
@@ -0,0 +1,146 @@
+package controller;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Date;
+
+import Classes.Category;
+import Interfaces.EventObserver;
+import javafx.application.Platform;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.image.Image;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.AnchorPane;
+import javafx.scene.layout.FlowPane;
+import javafx.scene.layout.HBox;
+import javafx.scene.text.Text;
+import model.NewsModel;
+
+public class Article{
+
+ /* Data */
+ private ArrayList items;
+ private FlowPane parent;
+ private EventObserver observer;
+
+
+ /* Constructor */
+ public Article(FlowPane p_parent, EventObserver observer){
+ this.parent = p_parent;
+ this.items = new ArrayList();
+ this.observer = observer;
+ }
+
+ public void addItem(NewsModel model) throws IOException {
+
+ /* (1) Load the article_disp.fxml */
+ FXMLLoader loader = new FXMLLoader();
+ loader.setLocation(getClass().getResource("/fxml/article_disp.fxml"));
+
+ /* (2) Get the loaded item*/
+ AnchorPane item = (AnchorPane) loader.load();
+
+ /* (3) Set content */
+ this.gsetContent( model.getDescription(), item );
+
+ /* (4) Set date */
+ this.gsetDate( model.getDate(), item );
+
+ /* (5) Set title */
+ HBox headerContainer = (HBox) item.getChildren().get(3);
+ this.gsetTitle( model.getTitle(), headerContainer );
+
+ /* (6) Set tags */
+ this.gsetTags( model.getTags(), headerContainer );
+
+ /* (7) Set image */
+ this.gsetImage( model.getImageURL(), item );
+
+ /* (8) Bind event */
+// item.setOnMousePressed(new EventHandler() {
+// @Override
+// public void handle(MouseEvent event) {
+// Article.this.observer.handleEvent(new Classes.Event(item.getId(),"changeMainLayout"));
+// }
+// });
+
+ /* (9) Add to the controller local */
+ this.items.add(item);
+
+ /* (10) On bind au width du parent */
+ item.prefWidthProperty().bind(this.parent.widthProperty());
+ item.maxWidthProperty().bind(this.parent.widthProperty());
+
+ /* (11) Add to parent (graphics) */
+ Platform.runLater(new Runnable(){
+ public void run(){
+ Article.this.parent.getChildren().add(item);
+ }
+ });
+ }
+
+
+
+ public void gsetContent(String p_content, AnchorPane p_parent){
+ /* (1) Get node */
+ Text g_content = (Text) p_parent.getChildren().get(1);
+
+ /* (2) Update content */
+ g_content.setText(p_content);
+ }
+
+
+ public void gsetDate(Date p_date, AnchorPane p_parent){
+ /* (1) Get node */
+ Text g_date = (Text) p_parent.getChildren().get(2);
+
+ /* (2) Update content */
+ g_date.setText(p_date.toString());
+
+ }
+
+
+ public void gsetTitle(String p_title, HBox p_parent){
+ /* (1) Get node */
+ Text g_title = (Text) p_parent.getChildren().get(0);
+
+ /* (2) Update title */
+ g_title.setText(p_title);
+ }
+
+
+ public void gsetImage(String p_uri, AnchorPane p_parent){
+ /* (1) Get node */
+ ImageView g_image = (ImageView) p_parent.getChildren().get(0);
+
+ /* (2) Update title */
+ g_image.setImage(new Image(p_uri));
+ }
+
+
+ public void gsetTags(ArrayList p_tags, HBox p_parent) throws IOException{
+
+ /* (1) For each tag -> load a new one */
+ for( Category tag : p_tags ){
+
+ /* (1.1) Create the container */
+ FXMLLoader loader = new FXMLLoader();
+ loader.setLocation(getClass().getResource("/fxml/article_tag_disp.fxml"));
+
+ /* (1.2) Load the tag elements */
+ FlowPane g_tag = (FlowPane) loader.load();
+ Text g_tagText = (Text) g_tag.getChildren().get(0);
+
+ /* (1.3) Update the tag name */
+ g_tagText.setText(tag.getLabel());
+
+ /* (1.4) Set the custom color */
+ g_tag.setStyle("-fx-background-color: "+tag.getColor());
+
+ /* (1.5) Ajout au parent*/
+ p_parent.getChildren().add(g_tag);
+
+ }
+ }
+
+}
diff --git a/controller/HeaderMenu.java b/controller/HeaderMenu.java
index 1565e01..2a2cc75 100644
--- a/controller/HeaderMenu.java
+++ b/controller/HeaderMenu.java
@@ -35,7 +35,7 @@ public class HeaderMenu{
menuItem.setOnMousePressed(new EventHandler() {
@Override
public void handle(MouseEvent event) {
- HeaderMenu.this.observer.handleEvent(new Classes.Event(menuItem.getId(),"changeMainLayout"));
+ HeaderMenu.this.observer.handleEvent(new Classes.Event(menuItem.getId(), "changeMainLayout"));
}
});
diff --git a/controller/RootLayout.java b/controller/RootLayout.java
index 60a965d..d051c7e 100644
--- a/controller/RootLayout.java
+++ b/controller/RootLayout.java
@@ -1,39 +1,37 @@
package controller;
import java.io.IOException;
-import java.util.HashMap;
+import java.util.ArrayList;
-import org.json.JSONObject;
-
-import Classes.ApiCall;
import Classes.Category;
-import Classes.Languages;
import Classes.SortTypes;
import Classes.css.user.ContextBuilder;
-import Classes.css.user.HeaderStyleSheet;
import Classes.css.user.HeaderIconStyleSheet;
+import Classes.css.user.HeaderStyleSheet;
import Classes.css.user.MenuStyleSheet;
import Classes.css.user.SubMenuStyleSheet;
-import Interfaces.Callback;
import Interfaces.Event;
import Interfaces.EventObserver;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
-import javafx.scene.control.MenuBar;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.FlowPane;
import javafx.stage.Stage;
+
import model.DictionaryModel;
import model.LangModel;
+
import model.NewsListModel;
+import model.NewsModel;
public class RootLayout extends Application implements EventObserver {
private Stage root_stage;
private Scene root_scene;
private AnchorPane root_layout;
-
+ private FlowPane main_container;
+ private Article articles;
@Override
@@ -49,9 +47,12 @@ public class RootLayout extends Application implements EventObserver {
/* (3) Load the CSS CONTEXT */
ContextBuilder.createContext();
+ /* (3) Store container */
+ this.main_container = (FlowPane) this.root_scene.lookup("#container");
- /* (1) HEADER
+
+ /* (1) Create controllers' views
-------------------------------------*/
/* (1) Create header menu */
HeaderMenu hm = new HeaderMenu((FlowPane) this.root_scene.lookup("#header_menu"),this);
@@ -62,6 +63,10 @@ public class RootLayout extends Application implements EventObserver {
hm.addItem("menu", "/src/header-menu.png");
+ /* (2) Create container */
+ this.articles = new Article(this.main_container, this);
+
+
/* (2) CSS
-------------------------------------*/
@@ -134,17 +139,33 @@ public class RootLayout extends Application implements EventObserver {
call.send();*/
switch(e.getEventType()){
+
case "changeMainLayout":
this.handleMainLayoutChange(e.getObjectId());
break;
+
case "NewsQuerySuccess":
System.out.println(NewsListModel.getInstance().getNews().size()+" News ont été trouvé");
if(NewsListModel.getInstance().getNews().size() != 0) {
System.out.println("Le titre du premier article est: "+NewsListModel.getInstance().getNews().get(0).getTitle());
System.out.println("La description du premier article est: "+NewsListModel.getInstance().getNews().get(0).getDescription());
- }
+ // For each news
+ for( NewsModel news : NewsListModel.getInstance().getNews() ){
+
+ try{
+
+ this.articles.addItem( news );
+
+ }catch(Exception e1){
+
+ System.out.println("Cannot fetch article data");
+ e1.printStackTrace();
+
+ }
+
break;
+
case "NewsQueryFailed":
System.out.println("une erreur est survenue");
break;
diff --git a/fxml/article_disp.fxml b/fxml/article_disp.fxml
new file mode 100644
index 0000000..d8a01d0
--- /dev/null
+++ b/fxml/article_disp.fxml
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fxml/article_tag_disp.fxml b/fxml/article_tag_disp.fxml
new file mode 100644
index 0000000..02adbaa
--- /dev/null
+++ b/fxml/article_tag_disp.fxml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/fxml/header_menu_disp.fxml b/fxml/header_menu_disp.fxml
deleted file mode 100644
index 9e78237..0000000
--- a/fxml/header_menu_disp.fxml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/fxml/model.fxml b/fxml/model.fxml
index b7e8479..695c627 100644
--- a/fxml/model.fxml
+++ b/fxml/model.fxml
@@ -1,10 +1,12 @@
+
+
@@ -52,6 +54,63 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/fxml/root_disp.fxml b/fxml/root_disp.fxml
deleted file mode 100644
index 348ddc7..0000000
--- a/fxml/root_disp.fxml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/model/NewsListModel.java b/model/NewsListModel.java
index e35711f..01d2653 100644
--- a/model/NewsListModel.java
+++ b/model/NewsListModel.java
@@ -158,12 +158,14 @@ public class NewsListModel implements Observable{
for(int i = 0;i tags;
private Date date;
+ public NewsModel(){
+ this.tags = new ArrayList();
+ }
+ public NewsModel addTag(Category tag) {
+ this.tags.add(tag);
+ return this;
+ }
public String getAuthor() {
return author;
@@ -40,6 +51,9 @@ public class NewsModel {
public String getNewsURL() {
return newsURL;
}
+ public ArrayList getTags() {
+ return tags;
+ }
public NewsModel setNewsURL(String newsURL) {
this.newsURL = newsURL;
return this;