diff --git a/.classpath b/.classpath index aab3aec..549bb8f 100644 --- a/.classpath +++ b/.classpath @@ -12,11 +12,7 @@ - - - - - + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 8e4055a..6249222 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,12 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.7 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/cookbook.db b/cookbook.db index 9dcb999..3a2daa6 100644 Binary files a/cookbook.db and b/cookbook.db differ diff --git a/src/main/java/db/Cookbook.java b/src/main/java/db/Cookbook.java index f8365dd..4460b5c 100644 --- a/src/main/java/db/Cookbook.java +++ b/src/main/java/db/Cookbook.java @@ -1,9 +1,15 @@ package db; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.sql.*; import java.util.LinkedList; import java.util.List; +import javax.imageio.ImageIO; +import javax.swing.ImageIcon; + import db.Recipe; public class Cookbook { @@ -35,7 +41,7 @@ public class Cookbook { } public boolean createTables() { - String createRecipes = "CREATE TABLE IF NOT EXISTS recipes (id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, ingredients varchar, description varchar, tags varchar)"; + String createRecipes = "CREATE TABLE IF NOT EXISTS recipes (id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar, ingredients varchar, description varchar, tags varchar, img blob)"; try { stat.execute(createRecipes); @@ -47,20 +53,40 @@ public class Cookbook { return true; } - public boolean insertRecipe(String name, String ingredients, String description, String tags) { + public boolean insertRecipe(String name, String ingredients, String description, String tags, ImageIcon img) { try { + //przekształcam ImageIcon -> BuforowanyImg + BufferedImage bImg = new BufferedImage(img.getIconWidth(), img.getIconHeight(), BufferedImage.TYPE_INT_ARGB); + + bImg.getGraphics().drawImage(img.getImage(), 0,0, null); + //tworzę strumień bajtowy + ByteArrayOutputStream bStream = new ByteArrayOutputStream(); + //zapisuję do strumienia bufor obrazka + ImageIO.write( bImg, "png", bStream ); + bStream.flush(); + + PreparedStatement prepStmt = conn.prepareStatement( - "INSERT INTO recipes VALUES (NULL, ?, ?, ?, ?);"); + "INSERT INTO recipes VALUES (NULL, ?, ?, ?, ?, ?);"); prepStmt.setString(1, name); prepStmt.setString(2, ingredients); prepStmt.setString(3, description); prepStmt.setString(4, tags); + prepStmt.setBytes(5, bStream.toByteArray()); prepStmt.execute(); - } catch (SQLException e) { + bStream.close(); + } + catch (SQLException e) { + System.err.println("Blad przy wstawianiu przepisu"); + e.printStackTrace(); + return false; + } + catch (IOException e) { System.err.println("Blad przy wstawianiu przepisu"); e.printStackTrace(); return false; } + return true; } @@ -72,11 +98,13 @@ public class Cookbook { ResultSet result = query.executeQuery(); int id; String ingredients, description, tags; + ImageIcon pict; id = result.getInt("id"); ingredients = result.getString("ingredients"); description = result.getString("description"); tags = result.getString("tags"); - selectedRecipe = new Recipe(id, name, ingredients, description, tags); + pict = new ImageIcon(result.getBytes("img")); + selectedRecipe = new Recipe(id, name, ingredients, description, tags, pict); } catch (SQLException e) { e.printStackTrace(); @@ -89,7 +117,6 @@ public class Cookbook { try { PreparedStatement query = conn.prepareStatement("DELETE FROM recipes WHERE name=?"); query.setString(1, name); - System.out.println(name); query.execute(); } catch (SQLException e) { e.printStackTrace(); diff --git a/src/main/java/db/Recipe.java b/src/main/java/db/Recipe.java index 3ed4472..4bf141d 100644 --- a/src/main/java/db/Recipe.java +++ b/src/main/java/db/Recipe.java @@ -1,11 +1,14 @@ package db; +import javax.swing.ImageIcon; + public class Recipe { private int id; private String name; private String ingredients; private String description; private String tags; + private ImageIcon img; public int getId() { return id; @@ -34,15 +37,21 @@ public class Recipe { public void setTags(String tags) { this.tags = tags; } - + public ImageIcon getImage() { + return img; + } + public void setImage(ImageIcon img) { + this.img = img; + } public Recipe() {} - public Recipe(int id, String name, String ingredients, String description, String tags) { + public Recipe(int id, String name, String ingredients, String description, String tags, ImageIcon img) { this.id = id; this.name = name; this.ingredients = ingredients; this.description = description; this.tags = tags; + this.img = img; } diff --git a/src/main/java/ksiazka/kucharska/App.java b/src/main/java/ksiazka/kucharska/App.java index 410588d..36671b4 100644 --- a/src/main/java/ksiazka/kucharska/App.java +++ b/src/main/java/ksiazka/kucharska/App.java @@ -1,6 +1,8 @@ package ksiazka.kucharska; +import java.awt.Dimension; import java.awt.EventQueue; +import java.awt.Toolkit; /** * Hello world! @@ -16,6 +18,12 @@ public class App try { System.out.println( "tworzę fMain..." ); FrmMain fMain = new FrmMain(); + + //wyśrodkowanie okna na ekranie + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (screenSize.width - fMain.getWidth()) / 2; + int y = (screenSize.height - fMain.getHeight()) / 2; + fMain.setLocation(x, y); fMain.setVisible(true); } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/ksiazka/kucharska/FrmMain.java b/src/main/java/ksiazka/kucharska/FrmMain.java index 1465bbc..6cd84c1 100644 --- a/src/main/java/ksiazka/kucharska/FrmMain.java +++ b/src/main/java/ksiazka/kucharska/FrmMain.java @@ -10,6 +10,7 @@ import javax.swing.border.EmptyBorder; import javax.swing.DefaultListModel; import javax.swing.ImageIcon; import javax.swing.JFileChooser; +import javax.swing.JOptionPane; import javax.swing.JSplitPane; import javax.swing.JButton; import javax.swing.JTextField; @@ -18,7 +19,6 @@ import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.GridBagLayout; import java.awt.GridBagConstraints; -import java.awt.Image; import java.awt.Insets; import java.awt.RenderingHints; @@ -37,6 +37,7 @@ import javax.swing.SwingConstants; import ksiazka.kucharska.RetrieveData; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; +import javax.swing.filechooser.FileNameExtensionFilter; public class FrmMain extends JFrame { @@ -58,12 +59,13 @@ public class FrmMain extends JFrame { private JButton btnLoadImg; public static JLabel lblRecipeTitle; private static DefaultListModel recipesListModel; - private JLabel imgRecipe; + public static JLabel imgRecipe; private JFileChooser fcImg; - private ImageIcon imgDefaultRecipe; + public static ImageIcon imgDefaultRecipe; private JList recipesList; void DeactivateAddMenu() { + btnAddRecipe.setEnabled(true); btnCancel.setVisible(false); btnDelRecipe.setEnabled(true); btnLoadImg.setVisible(false); @@ -78,6 +80,7 @@ public class FrmMain extends JFrame { } void ActivateAddMenu() { + btnAddRecipe.setEnabled(false); btnCancel.setVisible(true); btnDelRecipe.setEnabled(false); btnLoadImg.setVisible(true); @@ -89,13 +92,14 @@ public class FrmMain extends JFrame { txtTags.setEditable(true); lblRecipeTitle.setVisible(false); recipesList.setEnabled(false); - + imgRecipe.setIcon(imgDefaultRecipe); //czyszczenie pól formularza txtDescription.setText(""); txtEdTitle.setText(""); txtIngredients.setText(""); txtTags.setText(""); + } public static DefaultListModel getRecipesList() @@ -110,7 +114,7 @@ public class FrmMain extends JFrame { setResizable(false); setTitle("Książka Kucharska v1.0"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setBounds(100, 100, 800, 549); + setBounds(100, 100, 723, 549); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); @@ -191,8 +195,23 @@ public class FrmMain extends JFrame { DefaultListModel model = (DefaultListModel) recipesList.getModel(); if (recipesList.getSelectedIndex() != -1) { - RetrieveData.removeRecipe(recipesList.getSelectedValue().toString()); - model.remove(recipesList.getSelectedIndex()); + int dialogResult = JOptionPane.showConfirmDialog (null, "Czy na pewno chcesz usunąć przepis?", "Pytanie", JOptionPane.YES_NO_OPTION); + if(dialogResult == JOptionPane.YES_OPTION){ + RetrieveData.removeRecipe(recipesList.getSelectedValue().toString()); + model.remove(recipesList.getSelectedIndex()); + if (recipesList.getModel().getSize()>0) + { + recipesList.setSelectedIndex(0); + RetrieveData.fillComponents(recipesList.getSelectedValue().toString()); + } + else + { + txtDescription.setText(""); + lblRecipeTitle.setText("Nazwa przepisu"); + txtIngredients.setText(""); + txtTags.setText(""); + } + } } } }); @@ -206,9 +225,11 @@ public class FrmMain extends JFrame { btnSave.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { RetrieveData.addNewRecipe(); - DeactivateAddMenu(); DefaultListModel model = (DefaultListModel) recipesList.getModel(); model.addElement(txtEdTitle.getText()); + DeactivateAddMenu(); + recipesList.setSelectedIndex(recipesList.getModel().getSize()-1); + RetrieveData.fillComponents(recipesList.getSelectedValue().toString()); } }); btnSave.setVisible(false); @@ -217,7 +238,7 @@ public class FrmMain extends JFrame { txtEdTitle = new JTextField(); txtEdTitle.setVisible(false); - txtEdTitle.setBounds(12, 15, 295, 19); + txtEdTitle.setBounds(26, 15, 281, 19); panel_2.add(txtEdTitle); txtEdTitle.setColumns(10); @@ -253,38 +274,41 @@ public class FrmMain extends JFrame { btnLoadImg = new JButton("Wczytaj"); fcImg = new JFileChooser(); + FileNameExtensionFilter ffAll = new FileNameExtensionFilter("Wszystkie grafiki", "jpg", "jpeg", "gif", "png"); + fcImg.addChoosableFileFilter(ffAll); + fcImg.addChoosableFileFilter(new FileNameExtensionFilter("Pliki JPEG", "jpg", "jpeg")); + fcImg.addChoosableFileFilter(new FileNameExtensionFilter("Pliki GIF", "gif")); + fcImg.addChoosableFileFilter(new FileNameExtensionFilter("Pliki PNG", "png")); + fcImg.setAcceptAllFileFilterUsed(false); + fcImg.setFileFilter(ffAll); imgDefaultRecipe = new ImageIcon("no_img_recipe.jpg"); imgRecipe.setIcon(imgDefaultRecipe); btnLoadImg.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { + //otwórz okno dialogowe int returnVal = fcImg.showOpenDialog(FrmMain.this); - - if (returnVal == JFileChooser.APPROVE_OPTION) { - File file = fcImg.getSelectedFile(); - try { - BufferedImage srcImg = ImageIO.read(file); - int w = (int)Math.ceil(srcImg.getWidth()/(double)srcImg.getHeight()*imgRecipe.getHeight()); - - System.out.println(w); - - BufferedImage resizedImg = new BufferedImage(w, imgRecipe.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics2D g2 = resizedImg.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(srcImg, 0, 0, w, imgRecipe.getHeight(), null); - g2.dispose(); - - - ImageIcon iconLogo = new ImageIcon(resizedImg); - imgRecipe.setIcon(iconLogo); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - - } + if (returnVal == JFileChooser.APPROVE_OPTION) { + File file = fcImg.getSelectedFile(); + try { + BufferedImage srcImg = ImageIO.read(file); //czytaj plik + + //wyznacz szerokość obrazka jako stosunek (przy maksymalizacji wysokości + int w = (int)Math.ceil(srcImg.getWidth()/(double)srcImg.getHeight()*imgRecipe.getHeight()); + + BufferedImage resizedImg = new BufferedImage(w, imgRecipe.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics2D g2 = resizedImg.createGraphics(); + g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2.drawImage(srcImg, 0, 0, w, imgRecipe.getHeight(), null); + g2.dispose(); + ImageIcon iconLogo = new ImageIcon(resizedImg); + imgRecipe.setIcon(iconLogo); + + } catch (IOException e) { + e.printStackTrace(); + } + } } }); btnLoadImg.setVisible(false); @@ -305,6 +329,8 @@ public class FrmMain extends JFrame { btnCancel.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DeactivateAddMenu(); + if(recipesList.getSelectedIndex() != -1) + RetrieveData.fillComponents(recipesList.getSelectedValue().toString()); } }); btnCancel.setVisible(false); diff --git a/src/main/java/ksiazka/kucharska/RetrieveData.java b/src/main/java/ksiazka/kucharska/RetrieveData.java index 5cd1818..318cdff 100644 --- a/src/main/java/ksiazka/kucharska/RetrieveData.java +++ b/src/main/java/ksiazka/kucharska/RetrieveData.java @@ -3,6 +3,7 @@ package ksiazka.kucharska; import java.util.List; import javax.swing.DefaultListModel; +import javax.swing.ImageIcon; import db.Cookbook; import db.Recipe; @@ -18,11 +19,11 @@ public class RetrieveData extends FrmMain{ myCb.insertRecipe("Kanapka", "Chleb, margaryna, szynka", "Posmarować kanapke margaryną i położyć na niej plaster szynki", - "kanapka, szynka, chleb"); + "kanapka, szynka, chleb", imgDefaultRecipe); myCb.insertRecipe("Kanapka z sererm", "Chleb, margaryna, ser", "Posmarować kanapke margaryną i położyć na niej plaster sera", - "kanapka, ser, chleb"); + "kanapka, ser, chleb", imgDefaultRecipe); myCb.closeConnection(); } public static void fillList(){ @@ -45,11 +46,13 @@ public class RetrieveData extends FrmMain{ txtIngredients.setText(myRecipe.getIngredients()); txtDescription.setText(myRecipe.getDescription()); txtTags.setText(myRecipe.getTags()); + imgRecipe.setIcon(myRecipe.getImage()); myCb.closeConnection(); } public static void addNewRecipe(){ Cookbook myCb = new Cookbook(); - myCb.insertRecipe(txtEdTitle.getText(), txtIngredients.getText(), txtDescription.getText(), txtTags.getText()); + myCb.insertRecipe(txtEdTitle.getText(), txtIngredients.getText(), txtDescription.getText(), txtTags.getText(), (ImageIcon)imgRecipe.getIcon()); + myCb.closeConnection(); } public static void removeRecipe(String name){