package jffile;
/**
* Created : July 13, 2012
*
* @author pquiring
*/
import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.io.*;
import java.util.Calendar;
import javax.swing.*;
import javaforce.*;
import javaforce.linux.*;
public class JFileProperties extends javax.swing.JFrame {
//Don't use a real Dialog here cause that would stall the EDT
/**
* Creates new form EditIconProperties
*/
public JFileProperties(FileEntry entry, boolean deleteOnCancel) {
initComponents();
setPosition();
this.button = entry.button;
this.entry = entry;
File file = new File(entry.file);
if (!file.exists()) {
dispose();
return;
}
desktopFile = entry.file.endsWith(".desktop") && !file.isDirectory();
this.deleteOnCancel = deleteOnCancel;
filename.setText(entry.file);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(file.lastModified());
date.setText(String.format("%d-%d-%d %02d:%02d"
, c.get(Calendar.YEAR), c.get(Calendar.MONTH)+1, c.get(Calendar.DAY_OF_MONTH)
, c.get(Calendar.HOUR_OF_DAY), c.get(Calendar.MINUTE)));
size.setText("" + file.length());
if (!desktopFile) {
tabs.remove(shortcutPanel);
if (file.isDirectory()) {
//TODO : load folder stats (du)
}
} else {
tabs.setSelectedComponent(shortcutPanel);
String name = null, icon = null, exec = null;
try {
FileInputStream fis = new FileInputStream(file);
byte data[] = JF.readAll(fis);
fis.close();
String str = new String(data);
lns = str.split("\n");
boolean desktopEntry = false;
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("[Desktop Entry]")) {
desktopEntry = true;
continue;
}
if (lns[a].startsWith("[")) desktopEntry = false;
if (!desktopEntry) continue;
if (lns[a].startsWith("Name=")) {
name = lns[a].substring(5);
}
if (lns[a].startsWith("Icon=")) {
icon = lns[a].substring(5);
}
if (lns[a].startsWith("Exec=")) {
exec = lns[a].substring(5);
}
}
if ((name == null) || (icon == null) || (exec == null)) {
dispose();
return;
}
int i1 = entry.file.lastIndexOf("/");
name = entry.file.substring(i1+1, entry.file.length() - 8); //.desktop
iconName.setText(name);
iconCmd.setText(exec);
iconIcon.setText(icon);
} catch (Exception e) {
JFLog.log(e);
dispose();
return;
}
}
value = getPerms(entry.file);
octal.setText(Integer.toString(value,8));
owner_read.setSelected((value & 0x100) != 0);
owner_write.setSelected((value & 0x80) != 0);
owner_exec.setSelected((value & 0x40) != 0);
group_read.setSelected((value & 0x20) != 0);
group_write.setSelected((value & 0x10) != 0);
group_exec.setSelected((value & 0x08) != 0);
public_read.setSelected((value & 0x04) != 0);
public_write.setSelected((value & 0x02) != 0);
public_exec.setSelected((value & 0x01) != 0);
}
/**
* 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() {
tabs = new javax.swing.JTabbedPane();
generalTab = new javax.swing.JPanel();
jLabel5 = new javax.swing.JLabel();
filename = new javax.swing.JTextField();
jLabel6 = new javax.swing.JLabel();
date = new javax.swing.JTextField();
jLabel7 = new javax.swing.JLabel();
size = new javax.swing.JTextField();
shortcutPanel = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
jLabel3 = new javax.swing.JLabel();
iconName = new javax.swing.JTextField();
iconCmd = new javax.swing.JTextField();
iconIcon = new javax.swing.JTextField();
selectIcon = new javax.swing.JButton();
jLabel1 = new javax.swing.JLabel();
permissionsPanel = new javax.swing.JPanel();
jPanel5 = new javax.swing.JPanel();
group_read = new javax.swing.JCheckBox();
group_write = new javax.swing.JCheckBox();
group_exec = new javax.swing.JCheckBox();
jPanel6 = new javax.swing.JPanel();
public_read = new javax.swing.JCheckBox();
public_write = new javax.swing.JCheckBox();
public_exec = new javax.swing.JCheckBox();
octal = new javax.swing.JTextField();
jPanel3 = new javax.swing.JPanel();
owner_read = new javax.swing.JCheckBox();
owner_write = new javax.swing.JCheckBox();
owner_exec = new javax.swing.JCheckBox();
jLabel4 = new javax.swing.JLabel();
ok = new javax.swing.JButton();
cancel = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("Edit Properties");
setResizable(false);
jLabel5.setText("Filename");
filename.setEditable(false);
jLabel6.setText("Date");
date.setEditable(false);
jLabel7.setText("Size");
size.setEditable(false);
javax.swing.GroupLayout generalTabLayout = new javax.swing.GroupLayout(generalTab);
generalTab.setLayout(generalTabLayout);
generalTabLayout.setHorizontalGroup(
generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(generalTabLayout.createSequentialGroup()
.addContainerGap()
.addGroup(generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel5)
.addComponent(jLabel6)
.addComponent(jLabel7))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(filename)
.addComponent(date)
.addComponent(size, javax.swing.GroupLayout.DEFAULT_SIZE, 324, Short.MAX_VALUE))
.addContainerGap())
);
generalTabLayout.setVerticalGroup(
generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(generalTabLayout.createSequentialGroup()
.addContainerGap()
.addGroup(generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel5)
.addComponent(filename, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel6)
.addComponent(date, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(generalTabLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel7)
.addComponent(size, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(240, Short.MAX_VALUE))
);
tabs.addTab("General", generalTab);
jLabel2.setText("Command");
jLabel3.setText("Icon");
selectIcon.setText("Select...");
selectIcon.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
selectIconActionPerformed(evt);
}
});
jLabel1.setText("Name");
javax.swing.GroupLayout shortcutPanelLayout = new javax.swing.GroupLayout(shortcutPanel);
shortcutPanel.setLayout(shortcutPanelLayout);
shortcutPanelLayout.setHorizontalGroup(
shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(shortcutPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel2)
.addComponent(jLabel1)
.addComponent(jLabel3))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(iconName)
.addComponent(iconCmd)
.addGroup(shortcutPanelLayout.createSequentialGroup()
.addComponent(iconIcon, javax.swing.GroupLayout.DEFAULT_SIZE, 220, Short.MAX_VALUE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(selectIcon)))
.addContainerGap())
);
shortcutPanelLayout.setVerticalGroup(
shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(shortcutPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel1)
.addComponent(iconName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel2)
.addComponent(iconCmd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(shortcutPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel3)
.addComponent(iconIcon, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(selectIcon))
.addGap(192, 192, 192))
);
tabs.addTab("Shortcut", shortcutPanel);
jPanel5.setBorder(javax.swing.BorderFactory.createTitledBorder("Group"));
group_read.setText("Read");
group_read.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
group_readActionPerformed(evt);
}
});
group_write.setText("Write");
group_write.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
group_writeActionPerformed(evt);
}
});
group_exec.setText("Execute");
group_exec.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
group_execActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
jPanel5.setLayout(jPanel5Layout);
jPanel5Layout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel5Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(group_read)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(group_write)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(group_exec))
);
jPanel5Layout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel5Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(group_read, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(group_write)
.addComponent(group_exec))
.addContainerGap(12, Short.MAX_VALUE))
);
jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder("Public"));
public_read.setText("Read");
public_read.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
public_readActionPerformed(evt);
}
});
public_write.setText("Write");
public_write.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
public_writeActionPerformed(evt);
}
});
public_exec.setText("Execute");
public_exec.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
public_execActionPerformed(evt);
}
});
javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
jPanel6.setLayout(jPanel6Layout);
jPanel6Layout.setHorizontalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(public_read)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(public_write)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(public_exec))
);
jPanel6Layout.setVerticalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel6Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(public_read, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(public_write)
.addComponent(public_exec))
.addContainerGap(12, Short.MAX_VALUE))
);
octal.setText("000");
octal.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
octalKeyTyped(evt);
}
});
jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder("Owner"));
owner_read.setText("Read");
owner_read.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
owner_readActionPerformed(evt);
}
});
owner_write.setText("Write");
owner_write.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
owner_writeActionPerformed(evt);
}
});
owner_exec.setText("Execute");
owner_exec.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
owner_execActionPerformed(evt);
}
});
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(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(owner_read)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(owner_write)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(owner_exec))
);
jPanel3Layout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(owner_read)
.addComponent(owner_exec)
.addComponent(owner_write))
.addContainerGap(12, Short.MAX_VALUE))
);
jLabel4.setText("Octal:");
javax.swing.GroupLayout permissionsPanelLayout = new javax.swing.GroupLayout(permissionsPanel);
permissionsPanel.setLayout(permissionsPanelLayout);
permissionsPanelLayout.setHorizontalGroup(
permissionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(permissionsPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(permissionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(jPanel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel5, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jPanel3, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, permissionsPanelLayout.createSequentialGroup()
.addComponent(jLabel4)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(octal, javax.swing.GroupLayout.PREFERRED_SIZE, 133, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
permissionsPanelLayout.setVerticalGroup(
permissionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(permissionsPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(permissionsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jLabel4)
.addComponent(octal, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(80, Short.MAX_VALUE))
);
tabs.addTab("Permissions", permissionsPanel);
ok.setText("Ok");
ok.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
okActionPerformed(evt);
}
});
cancel.setText("Cancel");
cancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
cancelActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(tabs, javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cancel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ok)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(tabs, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 42, Short.MAX_VALUE)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(ok)
.addComponent(cancel))
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
private void selectIconActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_selectIconActionPerformed
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(new File("/usr/share/icons/hicolor/48x48/apps"));
if (chooser.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;
String icon = chooser.getSelectedFile().getName();
int i = icon.lastIndexOf(".");
iconIcon.setText(icon.substring(0, i));
}//GEN-LAST:event_selectIconActionPerformed
private void group_readActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_group_readActionPerformed
updateOctal();
}//GEN-LAST:event_group_readActionPerformed
private void group_writeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_group_writeActionPerformed
updateOctal();
}//GEN-LAST:event_group_writeActionPerformed
private void group_execActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_group_execActionPerformed
updateOctal();
}//GEN-LAST:event_group_execActionPerformed
private void public_readActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_public_readActionPerformed
updateOctal();
}//GEN-LAST:event_public_readActionPerformed
private void public_writeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_public_writeActionPerformed
updateOctal();
}//GEN-LAST:event_public_writeActionPerformed
private void public_execActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_public_execActionPerformed
updateOctal();
}//GEN-LAST:event_public_execActionPerformed
private void octalKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_octalKeyTyped
// TODO : consume invalid keys
}//GEN-LAST:event_octalKeyTyped
private void owner_readActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_owner_readActionPerformed
updateOctal();
}//GEN-LAST:event_owner_readActionPerformed
private void owner_writeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_owner_writeActionPerformed
updateOctal();
}//GEN-LAST:event_owner_writeActionPerformed
private void owner_execActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_owner_execActionPerformed
updateOctal();
}//GEN-LAST:event_owner_execActionPerformed
private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
value = -1;
dispose();
if (deleteOnCancel) {
new File(entry.file).delete();
}
}//GEN-LAST:event_cancelActionPerformed
private void okActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okActionPerformed
if (desktopFile) {
if (!saveShortcut()) return;
}
value = Integer.valueOf(octal.getText(), 8);
setPerms(value, entry.file);
dispose();
}//GEN-LAST:event_okActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton cancel;
private javax.swing.JTextField date;
private javax.swing.JTextField filename;
private javax.swing.JPanel generalTab;
private javax.swing.JCheckBox group_exec;
private javax.swing.JCheckBox group_read;
private javax.swing.JCheckBox group_write;
private javax.swing.JTextField iconCmd;
private javax.swing.JTextField iconIcon;
private javax.swing.JTextField iconName;
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.JPanel jPanel3;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JTextField octal;
private javax.swing.JButton ok;
private javax.swing.JCheckBox owner_exec;
private javax.swing.JCheckBox owner_read;
private javax.swing.JCheckBox owner_write;
private javax.swing.JPanel permissionsPanel;
private javax.swing.JCheckBox public_exec;
private javax.swing.JCheckBox public_read;
private javax.swing.JCheckBox public_write;
private javax.swing.JButton selectIcon;
private javax.swing.JPanel shortcutPanel;
private javax.swing.JTextField size;
private javax.swing.JTabbedPane tabs;
// End of variables declaration//GEN-END:variables
private JFileIcon button;
private FileEntry entry;
private String lns[];
private boolean deleteOnCancel, desktopFile;
public int value;
private void updateOctal() {
int newValue = 0;
if (owner_read.isSelected()) newValue += 0x100;
if (owner_write.isSelected()) newValue += 0x80;
if (owner_exec.isSelected()) newValue += 0x40;
if (group_read.isSelected()) newValue += 0x20;
if (group_write.isSelected()) newValue += 0x10;
if (group_exec.isSelected()) newValue += 0x08;
if (public_read.isSelected()) newValue += 0x04;
if (public_write.isSelected()) newValue += 0x02;
if (public_exec.isSelected()) newValue += 0x01;
octal.setText(Integer.toString(newValue,8));
}
private void badChar() {
JF.showError("Error", "Name can not contain special characters:\n\t\t/\\:*?<>|");
}
private boolean saveShortcut() {
String newName = iconName.getText().trim();
if (newName.length() == 0) {JF.showError("Error", "Name must not be empty"); return false;}
if (newName.indexOf("/") != -1) {badChar(); return false;}
if (newName.indexOf("\\") != -1) {badChar(); return false;}
if (newName.indexOf(":") != -1) {badChar(); return false;}
if (newName.indexOf("*") != -1) {badChar(); return false;}
if (newName.indexOf("?") != -1) {badChar(); return false;}
if (newName.indexOf("<") != -1) {badChar(); return false;}
if (newName.indexOf(">") != -1) {badChar(); return false;}
if (newName.indexOf("|") != -1) {badChar(); return false;}
//TODO : validate cmd
try {
int idx = entry.file.lastIndexOf("/");
String newfn = entry.file.substring(0, idx+1) + newName + ".desktop";
if (!entry.file.equals(newfn)) {
if (new File(newfn).exists()) {
JF.showError("Error", "A shortcut with the name already exists");
return false;
}
new File(entry.file).delete();
entry.file = newfn;
// Dock.dock.saveConfig(); //FIXME
}
FileOutputStream fos = new FileOutputStream(newfn);
boolean desktopEntry = false;
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("[Desktop Entry]")) {
desktopEntry = true;
} else if (lns[a].startsWith("[")) {
desktopEntry = false;
}
if (desktopEntry) {
if (lns[a].startsWith("Name=")) {
lns[a] = "Name=" + newName;
}
if (lns[a].startsWith("Icon=")) {
lns[a] = "Icon=" + iconIcon.getText();
}
if (lns[a].startsWith("Exec=")) {
lns[a] = "Exec=" + iconCmd.getText();
}
}
fos.write((lns[a] + "\n").getBytes());
}
fos.close();
//update icon
if (button != null) {
JFImage buttonImage = IconCache.loadIcon(iconIcon.getText());
buttonImage = IconCache.scaleIcon(buttonImage, JFileBrowser.ix, JFileBrowser.iy);
button.setIcon(buttonImage);
button.setText(newName);
button.repaint();
}
} catch (Exception e) {
JFLog.log(e);
}
return true;
}
private int getPerms(String file) {
//get file mode
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"stat", file}, false);
String lns[] = output.split("\n");
for(int a=0;a<lns.length;a++) {
if (lns[a].startsWith("Access:")) {
//Access: (0664/-rw-rw-r--) ...
int i1 = lns[a].indexOf('(');
int i2 = lns[a].indexOf('/');
if ((i1 == -1) || (i2 == -1)) return 0;
return Integer.valueOf(lns[a].substring(i1+1, i2), 8);
}
}
return 0;
}
private void setPerms(int value, String file) {
try {
ShellProcess sp = new ShellProcess();
String output = sp.run(new String[] {"chmod", Integer.toString(value, 8), file}, false);
} catch (Exception e) {
JFLog.log(e);
}
}
public static void main(String args[]) {
if (args.length != 1) {
System.out.println("Usage : jfileprops file");
return;
}
FileEntry entry = new FileEntry();
File file = new File(args[0]);
entry.file = file.getAbsolutePath();
JFileProperties dialog = new JFileProperties(entry, false);
dialog.setVisible(true);
}
private void setPosition() {
Dimension d = getSize();
Rectangle s = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
setLocation(s.width/2 - d.width/2, s.height/2 - d.height/2);
}
}