/* * Zettelkasten - nach Luhmann * Copyright (C) 2001-2015 by Daniel Lüdecke (http://www.danielluedecke.de) * * Homepage: http://zettelkasten.danielluedecke.de * * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU General Public License as published by the Free Software Foundation; either version 3 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with this program; * if not, see <http://www.gnu.org/licenses/>. * * * Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU * General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben * und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (wenn Sie möchten) * jeder späteren Version. * * Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein * wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder * der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der * GNU General Public License. * * Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm * erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. */ package de.danielluedecke.zettelkasten; import de.danielluedecke.zettelkasten.util.Constants; import de.danielluedecke.zettelkasten.database.Daten; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.net.URL; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.KeyStroke; import org.jdesktop.application.Action; /** * * @author danielludecke */ public class CRateEntry extends javax.swing.JDialog { private final Daten dataObj; private boolean cancelled = false; private final int entrynr; private static final int RATING_VALUE_NONE = 1; private static final int RATING_VALUE_HALF = 2; private static final int RATING_VALUE_FULL = 3; /** * get the strings for file descriptions from the resource map */ private final org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class). getContext().getResourceMap(CRateEntry.class); /** * * @param parent * @param d * @param nr */ public CRateEntry(java.awt.Frame parent, Daten d, int nr) { super(parent); dataObj = d; entrynr = nr; initComponents(); // set application icon setIconImage(Constants.zknicon.getImage()); // these codelines add an escape-listener to the dialog. so, when the user // presses the escape-key, the same action is performed as if the user // presses the cancel button... KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); ActionListener cancelAction = new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent evt) { cancel(); } }; getRootPane().registerKeyboardAction(cancelAction, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); // init entry data initEntryData(); // add listener for slider jSlider1.addChangeListener(new javax.swing.event.ChangeListener() { @Override public void stateChanged(javax.swing.event.ChangeEvent evt) { updateImages(); jButtonApply.setEnabled(true); } }); // make button mac style // if (isMacAqua) jButtonResetRating.putClientProperty("JButton.buttonType","roundRect"); // disable button jButtonApply.setEnabled(false); } /** * This method creates the image-tag for a rating-point * * @param ratingvalue the ratingvalue, i.e. whether the image-tag should contain a full, half or no value-point-image. * use following constants:<br> * <ul> * <li>{@link #RATING_VALUE_FULL RATING_VALUE_FULL}</li> * <li>{@link #RATING_VALUE_FULL RATING_VALUE_HALF}</li> * <li>{@link #RATING_VALUE_FULL RATING_VALUE_NONE}</li> * </ul> * @return the HTML-formatted image-tag with the requested rating-symbol */ private Icon getRatingSymbol(int ratingvalue) { // create value for img-name URL imgURL = null; // check which image to choose switch (ratingvalue) { // no rating point case RATING_VALUE_NONE: imgURL = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getClass().getResource("/de/danielluedecke/zettelkasten/resources/icons/bullet_black.png"); break; // half rating point case RATING_VALUE_HALF: imgURL = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getClass().getResource("/de/danielluedecke/zettelkasten/resources/icons/bullet_yellow.png"); break; // full rating point case RATING_VALUE_FULL: imgURL = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getClass().getResource("/de/danielluedecke/zettelkasten/resources/icons/bullet_green.png"); break; } // return result return new ImageIcon(imgURL); } private void updateImages() { // get slider position int value = jSlider1.getValue(); // set images for first star if (value>=2) jLabelRate1.setIcon(getRatingSymbol(RATING_VALUE_FULL)); else if (value>=1) jLabelRate1.setIcon(getRatingSymbol(RATING_VALUE_HALF)); else jLabelRate1.setIcon(getRatingSymbol(RATING_VALUE_NONE)); // set images for second star if (value>=4) jLabelRate2.setIcon(getRatingSymbol(RATING_VALUE_FULL)); else if (value>=3) jLabelRate2.setIcon(getRatingSymbol(RATING_VALUE_HALF)); else jLabelRate2.setIcon(getRatingSymbol(RATING_VALUE_NONE)); // set images for third star if (value>=6) jLabelRate3.setIcon(getRatingSymbol(RATING_VALUE_FULL)); else if (value>=5) jLabelRate3.setIcon(getRatingSymbol(RATING_VALUE_HALF)); else jLabelRate3.setIcon(getRatingSymbol(RATING_VALUE_NONE)); // set images for fourth star if (value>=8) jLabelRate4.setIcon(getRatingSymbol(RATING_VALUE_FULL)); else if (value>=7) jLabelRate4.setIcon(getRatingSymbol(RATING_VALUE_HALF)); else jLabelRate4.setIcon(getRatingSymbol(RATING_VALUE_NONE)); // set images for fifth star if (value>=10) jLabelRate5.setIcon(getRatingSymbol(RATING_VALUE_FULL)); else if (value>=9) jLabelRate5.setIcon(getRatingSymbol(RATING_VALUE_HALF)); else jLabelRate5.setIcon(getRatingSymbol(RATING_VALUE_NONE)); } private void initEntryData() { // get default text for label StringBuilder deftext = new StringBuilder(resourceMap.getString("jLabel1.text")); // add entrynumber and colon deftext.append(" ").append(String.valueOf(entrynr)).append(":"); // update label title jLabel1.setText(deftext.toString()); // get current rating value jLabelCurrentRating.setText(dataObj.getZettelRatingAsString(entrynr)); // get rating count, as string String ratingcount = String.valueOf(dataObj.getZettelRatingCount(entrynr)); // create numbers jLabelRatingCount.setText(ratingcount); } /** * When the user presses the cancel button, no update needed, close window */ @Action public void cancel() { cancelled = true; dispose(); setVisible(false); } @Action public void rateEntry() { // retrieve rate-value int rating = jSlider1.getValue(); // add rating to entry dataObj.addZettelRating(entrynr, (float) (rating/2.0)); cancelled = false; dispose(); setVisible(false); } @Action public void resetRating() { // reset rating dataObj.resetZettelRating(entrynr); cancelled = false; dispose(); setVisible(false); } public boolean isCancelled() { return cancelled; } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel1 = new javax.swing.JPanel(); jButtonApply = new javax.swing.JButton(); jButtonCancel = new javax.swing.JButton(); jPanel2 = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); jLabelRate2 = new javax.swing.JLabel(); jLabelRate1 = new javax.swing.JLabel(); jLabelRate4 = new javax.swing.JLabel(); jLabelRate5 = new javax.swing.JLabel(); jSlider1 = new javax.swing.JSlider(); jLabelRate3 = new javax.swing.JLabel(); jPanel3 = new javax.swing.JPanel(); jLabelCurrentRating = new javax.swing.JLabel(); jLabelCR = new javax.swing.JLabel(); jButtonResetRating = new javax.swing.JButton(); jLabel2 = new javax.swing.JLabel(); jLabelRatingCount = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getContext().getResourceMap(CRateEntry.class); setTitle(resourceMap.getString("FormRateEntry.title")); // NOI18N setModal(true); setName("FormRateEntry"); // NOI18N setResizable(false); jPanel1.setName("jPanel1"); // NOI18N javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getContext().getActionMap(CRateEntry.class, this); jButtonApply.setAction(actionMap.get("rateEntry")); // NOI18N jButtonApply.setName("jButtonApply"); // NOI18N jButtonCancel.setAction(actionMap.get("cancel")); // NOI18N jButtonCancel.setName("jButtonCancel"); // NOI18N jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel2.setName("jPanel2"); // NOI18N jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N jLabel1.setName("jLabel1"); // NOI18N jLabelRate2.setIcon(resourceMap.getIcon("jLabelRate2.icon")); // NOI18N jLabelRate2.setName("jLabelRate2"); // NOI18N jLabelRate1.setIcon(resourceMap.getIcon("jLabelRate1.icon")); // NOI18N jLabelRate1.setName("jLabelRate1"); // NOI18N jLabelRate4.setIcon(resourceMap.getIcon("jLabelRate4.icon")); // NOI18N jLabelRate4.setName("jLabelRate4"); // NOI18N jLabelRate5.setIcon(resourceMap.getIcon("jLabelRate5.icon")); // NOI18N jLabelRate5.setName("jLabelRate5"); // NOI18N jSlider1.setMaximum(10); jSlider1.setSnapToTicks(true); jSlider1.setValue(0); jSlider1.setName("jSlider1"); // NOI18N jLabelRate3.setIcon(resourceMap.getIcon("jLabelRate3.icon")); // NOI18N jLabelRate3.setName("jLabelRate3"); // NOI18N javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); jPanel2.setLayout(jPanel2Layout); jPanel2Layout.setHorizontalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(jSlider1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel2Layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRate1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRate2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRate3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRate4) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRate5))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel2Layout.setVerticalGroup( jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel2Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabelRate5, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabelRate4, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jLabelRate3, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jLabelRate1, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(jLabelRate2, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jSlider1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel3.setBorder(javax.swing.BorderFactory.createEtchedBorder()); jPanel3.setName("jPanel3"); // NOI18N jLabelCurrentRating.setText(resourceMap.getString("jLabelCurrentRating.text")); // NOI18N jLabelCurrentRating.setName("jLabelCurrentRating"); // NOI18N jLabelCR.setText(resourceMap.getString("jLabelCR.text")); // NOI18N jLabelCR.setName("jLabelCR"); // NOI18N jButtonResetRating.setAction(actionMap.get("resetRating")); // NOI18N jButtonResetRating.setName("jButtonResetRating"); // NOI18N jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N jLabel2.setName("jLabel2"); // NOI18N jLabelRatingCount.setText(resourceMap.getString("jLabelRatingCount.text")); // NOI18N jLabelRatingCount.setName("jLabelRatingCount"); // NOI18N javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); jPanel3.setLayout(jPanel3Layout); jPanel3Layout.setHorizontalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addComponent(jLabelCR) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelCurrentRating) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonResetRating)) .addGroup(jPanel3Layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jLabelRatingCount))) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); jPanel3Layout.setVerticalGroup( jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel3Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabelCurrentRating) .addComponent(jLabelCR) .addComponent(jButtonResetRating)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jLabelRatingCount)) .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addComponent(jButtonCancel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonApply))) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 12, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButtonCancel) .addComponent(jButtonApply)) .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addContainerGap()) ); pack(); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButtonApply; private javax.swing.JButton jButtonCancel; private javax.swing.JButton jButtonResetRating; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabelCR; private javax.swing.JLabel jLabelCurrentRating; private javax.swing.JLabel jLabelRate1; private javax.swing.JLabel jLabelRate2; private javax.swing.JLabel jLabelRate3; private javax.swing.JLabel jLabelRate4; private javax.swing.JLabel jLabelRate5; private javax.swing.JLabel jLabelRatingCount; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JPanel jPanel3; private javax.swing.JSlider jSlider1; // End of variables declaration//GEN-END:variables }