/* * 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.database.Daten; import de.danielluedecke.zettelkasten.database.Settings; import de.danielluedecke.zettelkasten.mac.ZknMacWidgetFactory; import de.danielluedecke.zettelkasten.util.ColorUtil; import de.danielluedecke.zettelkasten.util.Constants; import de.danielluedecke.zettelkasten.util.classes.InitStatusbarForTasks; import de.danielluedecke.zettelkasten.util.Tools; import java.awt.Color; import java.awt.Desktop; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.io.File; import java.io.IOException; import java.text.DecimalFormat; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.KeyStroke; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import org.jdesktop.application.Action; import org.jdesktop.application.Application; import org.jdesktop.application.ApplicationContext; import org.jdesktop.application.Task; import org.jdesktop.application.TaskMonitor; import org.jdesktop.application.TaskService; /** * * @author danielludecke */ public class CInformation extends javax.swing.JDialog { private Daten dataObj; private Settings settingsObj; private org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class). getContext().getResourceMap(CInformation.class); /** * * @param parent * @param d * @param s */ public CInformation(java.awt.Frame parent, Daten d, Settings s) { super(parent); dataObj = d; settingsObj = s; initComponents(); // set application icon setIconImage(Constants.zknicon.getImage()); /* * Constructor for Matte Border * public MatteBorder(int top, int left, int bottom, int right, Color matteColor) */ jScrollPane1.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, ColorUtil.getBorderGray(settingsObj))); jScrollPane1.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, ColorUtil.getBorderGray(settingsObj))); // init the progressbar and animated icon for background tasks InitStatusbarForTasks isb = new InitStatusbarForTasks(statusLabel, null, statusMessageLabel); // 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) { closeWindow(); } }; getRootPane().registerKeyboardAction(cancelAction, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW); // set default button getRootPane().setDefaultButton(jButtonClose); if (settingsObj.isSeaGlass()) { jButtonApply.putClientProperty("JComponent.sizeVariant", "small"); jButtonClose.putClientProperty("JComponent.sizeVariant", "small"); jButtonBrowseAttachmentPath.putClientProperty("JComponent.sizeVariant", "small"); jButtonBrowseImagePath.putClientProperty("JComponent.sizeVariant", "small"); // set new border text jTextAreaDescription.setBorder(ZknMacWidgetFactory.getTitledBorder(resourceMap.getString("jTextAreaDescription.border.title"), null, settingsObj)); jTextAreaSysInfo.setBorder(ZknMacWidgetFactory.getTitledBorder(resourceMap.getString("jTextAreaSysInfo.border.title"), null, settingsObj)); } if (settingsObj.isMacAqua()) { jTextAreaDescription.setBorder(ZknMacWidgetFactory.getTitledBorder(resourceMap.getString("jTextAreaDescription.border.title"), ColorUtil.colorJTreeText, settingsObj)); jTextAreaSysInfo.setBorder(ZknMacWidgetFactory.getTitledBorder(resourceMap.getString("jTextAreaSysInfo.border.title"), ColorUtil.colorJTreeText, settingsObj)); } // retrieve filepath String filepath = settingsObj.getFilePath().toString(); try { // and path to file as well as file name String path = filepath.substring(0, filepath.lastIndexOf(File.separatorChar)); String name = filepath.substring(filepath.lastIndexOf(File.separatorChar)+1); // set file name and path into textfields jTextFieldPath.setText(path); jLabelName.setText(name); } catch (IndexOutOfBoundsException ex) { } // set version info String verinfo = dataObj.getVersionInfo(); if (verinfo!=null) { jLabelVersion.setText(verinfo); } // and description of the data file jTextAreaDescription.setText(dataObj.getZknDescription()); // get user attachment and image paths File attpath = dataObj.getUserAttachmentPath(); if (attpath!=null) { jTextFieldAttachmentPath.setText(attpath.toString()); } File imgpath = dataObj.getUserImagePath(); if (imgpath!=null) { jTextFieldImagePath.setText(imgpath.toString()); } jButtonBrowseAttachmentPath.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent evt) { JFileChooser fc = new JFileChooser(); // set dialog's title fc.setDialogTitle(resourceMap.getString("fileChooserTitle")); // restrict all files as choosable fc.setAcceptAllFileFilterUsed(false); // only directories should be selected fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int option = fc.showOpenDialog(null); // if a file was chosen, set the filepath if (JFileChooser.APPROVE_OPTION == option) { // get the filepath... jTextFieldAttachmentPath.setText(fc.getSelectedFile().toString()); dataObj.setUserAttachmentPath(fc.getSelectedFile().toString()); } } }); jButtonBrowseImagePath.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent evt) { JFileChooser fc = new JFileChooser(); // set dialog's title fc.setDialogTitle(resourceMap.getString("fileChooserTitle")); // restrict all files as choosable fc.setAcceptAllFileFilterUsed(false); // only directories should be selected fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); int option = fc.showOpenDialog(null); // if a file was chosen, set the filepath if (JFileChooser.APPROVE_OPTION == option) { // get the filepath... jTextFieldImagePath.setText(fc.getSelectedFile().toString()); dataObj.setUserImagePath(fc.getSelectedFile().toString()); } } }); jTextFieldAttachmentPath.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { checkPath(jTextFieldAttachmentPath); } @Override public void insertUpdate(DocumentEvent e) { checkPath(jTextFieldAttachmentPath); } @Override public void removeUpdate(DocumentEvent e) { checkPath(jTextFieldAttachmentPath); } }); jTextFieldImagePath.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { checkPath(jTextFieldImagePath); } @Override public void insertUpdate(DocumentEvent e) { checkPath(jTextFieldImagePath); } @Override public void removeUpdate(DocumentEvent e) { checkPath(jTextFieldImagePath); } }); // calculate file-size of data file File f = settingsObj.getFilePath(); long length = f.length(); double lkb = (double)length / 1024.0; double lmb = lkb / 1024.0; // format file-size into MiB and KiB DecimalFormat df = new DecimalFormat("#0.00"); String size = df.format(lmb)+" Megabyte ("+df.format(lkb)+" Kilobyte)"; // set filesize jLabelSize.setText(size); // retrieve system information like used JRE and OS jTextAreaSysInfo.setText(Tools.getSystemInformation()); jButtonApply.setEnabled(false); jTextAreaDescription.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { jButtonApply.setEnabled(true); } @Override public void insertUpdate(DocumentEvent e) { jButtonApply.setEnabled(true); } @Override public void removeUpdate(DocumentEvent e) { jButtonApply.setEnabled(true); } }); // start the background task manually Task countWordT = countWords(); // get the application's context... ApplicationContext appC = Application.getInstance().getContext(); // ...to get the TaskMonitor and TaskService TaskMonitor tM = appC.getTaskMonitor(); TaskService tS = appC.getTaskService(); // with these we can execute the task and bring it to the foreground // i.e. making the animated progressbar and busy icon visible tS.execute(countWordT); tM.setForegroundTask(countWordT); } private void checkPath(javax.swing.JTextField tf) { // retrieve file path from textfield String fps = tf.getText(); // check whether path exists if (!fps.isEmpty()) { // create file-variable File fp = new File(fps); // check for existence tf.setForeground((fp.exists())?Color.black:Color.red); } else { // indicate that path is OK tf.setForeground(Color.black); } // enable apply button jButtonApply.setEnabled(true); } @Action public void openFileDir() { try { Desktop.getDesktop().open(new File(jTextFieldPath.getText())); } catch (IOException ex) { } } @Action public void closeWindow() { setVisible(false); dispose(); } @Action public void applyDescription() { dataObj.setUserAttachmentPath(jTextFieldAttachmentPath.getText()); dataObj.setUserImagePath(jTextFieldImagePath.getText()); dataObj.setZknDescription(jTextAreaDescription.getText()); closeWindow(); } @Action public final Task countWords() { return new countWordsTask(org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class)); } private class countWordsTask extends org.jdesktop.application.Task<Object, Void> { // init variabls int totalWords; int totalEntries; countWordsTask(org.jdesktop.application.Application app) { // Runs on the EDT. Copy GUI state that // doInBackground() depends on from parameters // to createLinksTask fields, here. super(app); } @Override protected Object doInBackground() { // init variabls totalWords = 0; totalEntries = 0; // go through all entries and calculate wordcount... for (int cnt=1; cnt<=dataObj.getCount(Daten.ZKNCOUNT); cnt++) { // check whether entry is not deleted if (!dataObj.isDeleted(cnt)) { // increase entry counter totalEntries++; // get complete entry-content, i.e. title and content String wordcoutnstring = dataObj.getZettelTitle(cnt)+" "+dataObj.getCleanZettelContent(cnt); // split complete content at each word String[] words = wordcoutnstring.toLowerCase(). replace("ä","ae"). replace("ö","oe"). replace("ü","ue"). replace("ß","ss"). split("\\W"); // init wordcounter int wordcount=0; // iterate all words of the entry for (String word : words) { // remove all non-letter-chars and trim spaces word = word.replace("([^A-Za-z0-9]+)", "").trim(); // if we have a "word" with more than one char, count it as word... if (!word.isEmpty() /* && word.length()>1 */) { wordcount++; } } // calculate total word-count totalWords = totalWords+wordcount; } // set status message setMessage(resourceMap.getString("wordCountText",String.valueOf(totalWords),String.valueOf(totalEntries))); } return null; } @Override protected void succeeded(Object result) { // Runs on the EDT. Update the GUI based on // the result computed by doInBackground(). } @Override protected void finished() { // calculate average words per entry double wpe = (double)totalWords / totalEntries; DecimalFormat df = new DecimalFormat("#0.00"); String wpeString = df.format(wpe); // set results statusMessageLabel.setText(resourceMap.getString("wordCountTextFinal",String.valueOf(totalWords),String.valueOf(totalEntries),wpeString)); } } /** 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() { jLabel1 = new javax.swing.JLabel(); jLabelName = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); jTextFieldPath = new javax.swing.JTextField(); jButtonOpenDir = new javax.swing.JButton(); jLabel3 = new javax.swing.JLabel(); jLabelVersion = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel(); jLabelSize = new javax.swing.JLabel(); jScrollPane1 = new javax.swing.JScrollPane(); jTextAreaDescription = new javax.swing.JTextArea(); jButtonClose = new javax.swing.JButton(); jButtonApply = new javax.swing.JButton(); jScrollPane2 = new javax.swing.JScrollPane(); jTextAreaSysInfo = new javax.swing.JTextArea(); jLabel4 = new javax.swing.JLabel(); statusMessageLabel = new javax.swing.JLabel(); statusLabel = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel(); jTextFieldAttachmentPath = new javax.swing.JTextField(); jButtonBrowseAttachmentPath = new javax.swing.JButton(); jLabel7 = new javax.swing.JLabel(); jTextFieldImagePath = new javax.swing.JTextField(); jButtonBrowseImagePath = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getContext().getResourceMap(CInformation.class); setTitle(resourceMap.getString("FormCInformation.title")); // NOI18N setModal(true); setName("FormCInformation"); // NOI18N jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N jLabel1.setName("jLabel1"); // NOI18N jLabelName.setText(resourceMap.getString("jLabelName.text")); // NOI18N jLabelName.setName("jLabelName"); // NOI18N jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N jLabel2.setName("jLabel2"); // NOI18N jTextFieldPath.setName("jTextFieldPath"); // NOI18N javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(de.danielluedecke.zettelkasten.ZettelkastenApp.class).getContext().getActionMap(CInformation.class, this); jButtonOpenDir.setAction(actionMap.get("openFileDir")); // NOI18N jButtonOpenDir.setBorderPainted(false); jButtonOpenDir.setContentAreaFilled(false); jButtonOpenDir.setFocusPainted(false); jButtonOpenDir.setName("jButtonOpenDir"); // NOI18N jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N jLabel3.setName("jLabel3"); // NOI18N jLabelVersion.setText(resourceMap.getString("jLabelVersion.text")); // NOI18N jLabelVersion.setName("jLabelVersion"); // NOI18N jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N jLabel5.setName("jLabel5"); // NOI18N jLabelSize.setText(resourceMap.getString("jLabelSize.text")); // NOI18N jLabelSize.setName("jLabelSize"); // NOI18N jScrollPane1.setName("jScrollPane1"); // NOI18N jTextAreaDescription.setLineWrap(true); jTextAreaDescription.setWrapStyleWord(true); jTextAreaDescription.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jTextAreaDescription.border.title"))); // NOI18N jTextAreaDescription.setName("jTextAreaDescription"); // NOI18N jScrollPane1.setViewportView(jTextAreaDescription); jButtonClose.setAction(actionMap.get("closeWindow")); // NOI18N jButtonClose.setName("jButtonClose"); // NOI18N jButtonApply.setAction(actionMap.get("applyDescription")); // NOI18N jButtonApply.setName("jButtonApply"); // NOI18N jScrollPane2.setName("jScrollPane2"); // NOI18N jTextAreaSysInfo.setLineWrap(true); jTextAreaSysInfo.setRows(3); jTextAreaSysInfo.setWrapStyleWord(true); jTextAreaSysInfo.setBorder(javax.swing.BorderFactory.createTitledBorder(resourceMap.getString("jTextAreaSysInfo.border.title"))); // NOI18N jTextAreaSysInfo.setName("jTextAreaSysInfo"); // NOI18N jScrollPane2.setViewportView(jTextAreaSysInfo); jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N jLabel4.setName("jLabel4"); // NOI18N statusMessageLabel.setText(resourceMap.getString("statusMessageLabel.text")); // NOI18N statusMessageLabel.setName("statusMessageLabel"); // NOI18N statusLabel.setIcon(resourceMap.getIcon("statusLabel.icon")); // NOI18N statusLabel.setName("statusLabel"); // NOI18N jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N jLabel6.setName("jLabel6"); // NOI18N jTextFieldAttachmentPath.setName("jTextFieldAttachmentPath"); // NOI18N jButtonBrowseAttachmentPath.setText(resourceMap.getString("jButtonBrowseAttachmentPath.text")); // NOI18N jButtonBrowseAttachmentPath.setName("jButtonBrowseAttachmentPath"); // NOI18N jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N jLabel7.setName("jLabel7"); // NOI18N jTextFieldImagePath.setName("jTextFieldImagePath"); // NOI18N jButtonBrowseImagePath.setText(resourceMap.getString("jButtonBrowseImagePath.text")); // NOI18N jButtonBrowseImagePath.setName("jButtonBrowseImagePath"); // NOI18N javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel5) .addComponent(jLabel1)) .addGap(31, 31, 31) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabelName) .addComponent(jLabelSize) .addComponent(jLabelVersion))) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel4) .addGap(37, 37, 37) .addComponent(statusMessageLabel) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(statusLabel)) .addGroup(layout.createSequentialGroup() .addComponent(jButtonClose) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonApply)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextFieldPath) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonOpenDir, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel6) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextFieldAttachmentPath) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonBrowseAttachmentPath)) .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup() .addComponent(jLabel7) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jTextFieldImagePath) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jButtonBrowseImagePath))) .addContainerGap()) .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) .addGroup(layout.createSequentialGroup() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(jLabelName)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel5) .addComponent(jLabelSize)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel3) .addComponent(jLabelVersion)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) .addComponent(jLabel4) .addComponent(statusMessageLabel) .addComponent(statusLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2) .addComponent(jTextFieldPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))) .addComponent(jButtonOpenDir)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel6) .addComponent(jTextFieldAttachmentPath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButtonBrowseAttachmentPath)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel7) .addComponent(jTextFieldImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(jButtonBrowseImagePath)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 185, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jButtonClose) .addComponent(jButtonApply)) .addGap(3, 3, 3)) ); pack(); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton jButtonApply; private javax.swing.JButton jButtonBrowseAttachmentPath; private javax.swing.JButton jButtonBrowseImagePath; private javax.swing.JButton jButtonClose; private javax.swing.JButton jButtonOpenDir; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel6; private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabelName; private javax.swing.JLabel jLabelSize; private javax.swing.JLabel jLabelVersion; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea jTextAreaDescription; private javax.swing.JTextArea jTextAreaSysInfo; private javax.swing.JTextField jTextFieldAttachmentPath; private javax.swing.JTextField jTextFieldImagePath; private javax.swing.JTextField jTextFieldPath; private javax.swing.JLabel statusLabel; private javax.swing.JLabel statusMessageLabel; // End of variables declaration//GEN-END:variables }