package jfapps;
/**
* Created : Mar 1, 2012
*
* @author pquiring
*/
import java.util.*;
import java.awt.*;
import javax.swing.*;
import javaforce.*;
import javaforce.linux.*;
public class MainPanel extends javax.swing.JPanel {
/**
* Creates new form AppsPanel
*/
public MainPanel() {
initComponents();
This = this;
loadSection();
initLayout();
Linux.detectDistro();
switch (Linux.distro) {
case Ubuntu: distroIdx = 2; break;
case Fedora: distroIdx = 3; break;
default: JF.showError("Error", "unsupported distro"); System.exit(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() {
jScrollPane1 = new javax.swing.JScrollPane();
sections = new javax.swing.JList();
appsScroll = new javax.swing.JScrollPane();
apps = new javax.swing.JPanel();
searchField = new javax.swing.JTextField();
search = new javax.swing.JButton();
sections.setModel(new javax.swing.AbstractListModel() {
String[] strings = { "Web", "Office", "Graphics", "MultiMedia", "Communcations", "System", "Development" };
public int getSize() { return strings.length; }
public Object getElementAt(int i) { return strings[i]; }
});
sections.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
sections.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
sectionsValueChanged(evt);
}
});
jScrollPane1.setViewportView(sections);
appsScroll.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(java.awt.event.ComponentEvent evt) {
appsScrollComponentResized(evt);
}
});
apps.setLayout(null);
appsScroll.setViewportView(apps);
searchField.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyTyped(java.awt.event.KeyEvent evt) {
searchFieldKeyTyped(evt);
}
});
search.setText("Search");
search.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
searchActionPerformed(evt);
}
});
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(appsScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 370, Short.MAX_VALUE))
.addGroup(layout.createSequentialGroup()
.addComponent(searchField)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(search)))
.addContainerGap())
);
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.LEADING)
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 481, Short.MAX_VALUE)
.addComponent(appsScroll))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(searchField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(search))
.addContainerGap())
);
}// </editor-fold>//GEN-END:initComponents
private void sectionsValueChanged(javax.swing.event.ListSelectionEvent evt) {//GEN-FIRST:event_sectionsValueChanged
searchString = null;
section = sections.getSelectedIndex();
loadSection();
}//GEN-LAST:event_sectionsValueChanged
private void searchActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchActionPerformed
search();
}//GEN-LAST:event_searchActionPerformed
private void searchFieldKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_searchFieldKeyTyped
if (evt.getKeyChar() == java.awt.event.KeyEvent.VK_ENTER) search();
}//GEN-LAST:event_searchFieldKeyTyped
private void appsScrollComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_appsScrollComponentResized
apps.doLayout();
}//GEN-LAST:event_appsScrollComponentResized
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel apps;
private javax.swing.JScrollPane appsScroll;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JButton search;
private javax.swing.JTextField searchField;
private javax.swing.JList sections;
// End of variables declaration//GEN-END:variables
private int section = -1;
private static MainPanel This;
private String searchString;
private int distroIdx = -1;
//name, desc, ubuntu, fedora
private String data[][][] = {
//Web
{
{"Chromium", "Google Chromium Web Browser (no flash)", "chromium-browser", null},
{"Chrome", "Google Chrome Web Browser (flash)", "google-chrome-stable", "google-chrome-stable"},
{"Firefox", "Firefox Web Browser", "firefox", "firefox"},
{"Flash", "Flash media plugin", "flashplugin-installer", "flash-plugin"},
{"Torrent", "Torrent Client", "jtorrent", "jtorrent"},
// {"Java Web Plugin", "Java Applet support", "icedtea-6-plugin", "icedtea-web"}, //no java 8 support???
},
//Office
{
{"LibreOffice", "Edit office documents", "libreoffice", "libreoffice"},
{"Google PDF Reader", "View PDF documents (requires chrome)", "chrome-pdf", "chrome-pdf"},
{"Evince PDF Reader", "View PDF documents", "evince", "evince"},
},
//Graphics
{
{"Paint", "Edit images", "jpaint", "jpaint"},
},
//MultiMedia
{
{"Media Player", "Play Media files", "jmedia", "jmedia"},
{"Audio Editor", "Edit audio files", "jaudio", "jaudio"},
{"Video Creator", "Create video files", "jvideo", "jvideo"},
{"Music Composer", "Create music", "jmusic", "jmusic"},
{"Record Desktop", "Records your desktop or window to a video file", "jrecorddesktop", "jrecorddesktop"},
{"Record Camera", "Records your camera to a video file", "jrecordcamera", "jrecordcamera"},
{"Audacity", "Edit audio files", "audacity", "audacity"},
},
//Communications
{
{"jPhoneLite", "VoIP/SIP Phone", "jphonelite", "jphonelite"},
{"jPBXLite", "VoIP/SIP PBX", "jpbxlite", "jpbxlite"},
},
//System
{
{"Archive Manager", "Manipulate Archive files (zip, tar)", "jarchive", "jarchive"},
{"Calculator", "Perform calculations", "jcalc", "jcalc"},
{"FTP Manager", "Manage files thru FTP", "jftp", "jftp"},
{"Help System", "Integrated help system", "jhelp", "jhelp"},
{"nVidia Drivers", "Improved 3D Graphics support for nVidia hardware", "nvidia-current", null},
{"nVidia Settings", "Configure nVidia hardware", "nvidia-settings", null},
{"Partition Editor", "Modify partition tables", "jparted", "jparted"},
{"QEMU Manager", "Virtual Machine Manager", "jqemu", "jqemu"},
{"Remote Desktop Manager", "Make connections to RDP/VNC remote desktops", "jremote", "jremote"},
{"Repository Selector", "Select your repo geo-graphically", "jrepo", null},
{"Terminal Emulator", "Access system shell (local or remote)", "jterm", "jterm"},
{"Task Manager", "View running tasks and resources", "jtaskmgr", "jtaskmgr"},
{"Text Editor", "Edit text files", "jtxtedit", "jtxtedit"},
{"Wine", "Run MS-Windows apps", "wine", "wine"},
{"DosBox", "Run MS-DOS apps", "dosbox", "dosbox"},
{"Darling", "Run Mac OSX apps", "darling-amd64", null},
},
//Development
{
{"Java JDK 8", "Java Development Kit", "openjdk-8-jdk", null},
{"NetBeans", "Extensible Java IDE", "netbeans", "netbeans-platform"},
{"ant", "Build Java projects", "ant", "ant"},
{"VisualVM", "Java Developement Tool", "jvisualvm", "jvisualvm"},
{"hex", "hex editor", "jhex", "jhex"},
{"hexbig", "hexbig editor (for very large files)", "jhexbig", "jhexbig"},
},
};
private Dimension appsSize;
private class AppsLayout implements LayoutManager {
// private Vector<Component> list = new Vector<Component>();
public void addLayoutComponent(String string, Component cmp) {
// list.add(cmp);
}
public void removeLayoutComponent(Component cmp) {
// list.remove(cmp);
}
public Dimension preferredLayoutSize(Container c) {
if (appsSize == null) layoutContainer(c);
return appsSize;
}
public Dimension minimumLayoutSize(Container c) {
return preferredLayoutSize(c);
}
public void layoutContainer(Container c) {
int cnt = c.getComponentCount();
int x = appsScroll.getViewport().getWidth();
if (x < 145) x = 145; //min size
int cx = 0;
int cy = 0;
for(int a=0;a<cnt;a++) {
Component child = c.getComponent(a);
child.setBounds(0, cy, x, 102);
cy += 102;
}
c.setPreferredSize(new Dimension(x, cy));
appsSize = new Dimension(x, cy);
}
}
private void initLayout() {
//again, can't figure out NetBeans layout mgrs
apps.setLayout(new AppsLayout());
}
private void loadSection() {
apps.removeAll();
if (searchString != null) {
doSearch();
return;
}
if (section == -1) {
JLabel label = new JLabel("Select a category on the left");
label.setHorizontalAlignment(SwingConstants.CENTER);
apps.add(label);
update();
return;
}
String sec[][] = data[section];
for (int a = 0; a < sec.length; a++) {
if (sec[a][distroIdx] == null) continue;
String pkg = sec[a][distroIdx];
if (pkg.startsWith("#web#")) {
String web = pkg.substring(5);
pkg = null;
if (web.equals("pdf")) {
pkg = null; //not a package
} else if (web.equals("chrome")) {
pkg = "chrome";
}
if (pkg == null) pkg = "unknown";
}
App app = new App();
//name desc pkg installed
app.setup(sec[a][0], sec[a][1], sec[a][distroIdx], Linux.isInstalled(sec[a][distroIdx]));
apps.add(app);
}
update();
}
public static void reload() {
Linux.updateInstalled();
This.loadSection();
}
private void search() {
searchString = searchField.getText();
loadSection();
}
private void doSearch() {
if (searchString.length() < 3) {
JLabel label = new JLabel("Search field must be at least 3 chars");
label.setHorizontalAlignment(SwingConstants.CENTER);
apps.add(label);
update();
return;
}
String pkgs[][] = Linux.searchPackages(searchString); //name, desc
int cnt = 0;
for(int a=0;a<pkgs.length;a++) {
if (pkgs[a][0] == null) continue;
App app = new App();
//name desc pkg installed
app.setup(pkgs[a][0], pkgs[a][1], pkgs[a][0], Linux.isInstalled(pkgs[a][0]));
apps.add(app);
cnt++;
}
if (cnt == 0) {
JLabel label = new JLabel("Search returned no results");
label.setHorizontalAlignment(SwingConstants.CENTER);
apps.add(label);
}
update();
}
private void update() {
apps.doLayout();
appsScroll.doLayout();
apps.revalidate();
apps.repaint();
}
}