Author: paperwing
Date: 2012-04-09 16:12:25 -0700 (Mon, 09 Apr 2012)
New Revision: 28773

Added:
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedEvent.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedListener.java
Removed:
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppEvent.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppListener.java
Modified:
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/App.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/CurrentlyInstalledAppsPanel.java
   
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/InstallNewAppsPanel.java
Log:
Now able to view available apps in the "currently installed apps" tab of the 
app manager, able to enable/disable selected apps by clicking on enable/disable 
buttons. App files are appropriated moved in the local storage directory 
between the directory containing installed apps and the directory containing 
uninstalled apps. Table of available apps is now rebuilt each time an app 
changes state.

Deleted: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppEvent.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppEvent.java
      2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppEvent.java
      2012-04-09 23:12:25 UTC (rev 28773)
@@ -1,24 +0,0 @@
-package org.cytoscape.app.internal.event;
-
-import org.cytoscape.app.internal.manager.App;
-import org.cytoscape.app.internal.manager.AppManager;
-import org.cytoscape.event.AbstractCyEvent;
-
-public final class AppEvent {
-
-       private AppManager source;
-       private App app;
-
-       public AppEvent(AppManager source, App app) {
-               this.source = source;
-               this.app = app;
-       }
-       
-       public AppManager getSource() {
-               return source;
-       }
-       
-       public App getApp() {
-               return app;
-       }
-}

Deleted: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppListener.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppListener.java
   2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppListener.java
   2012-04-09 23:12:25 UTC (rev 28773)
@@ -1,8 +0,0 @@
-package org.cytoscape.app.internal.event;
-
-public interface AppListener {
-       
-       public void appInstalled(AppEvent event);
-       
-       public void appUninstalled(AppEvent event);
-}

Copied: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedEvent.java
 (from rev 28769, 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppEvent.java)
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedEvent.java
                              (rev 0)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedEvent.java
      2012-04-09 23:12:25 UTC (rev 28773)
@@ -0,0 +1,18 @@
+package org.cytoscape.app.internal.event;
+
+import org.cytoscape.app.internal.manager.App;
+import org.cytoscape.app.internal.manager.AppManager;
+import org.cytoscape.event.AbstractCyEvent;
+
+public final class AppsChangedEvent {
+
+       private AppManager source;
+
+       public AppsChangedEvent(AppManager source) {
+               this.source = source;
+       }
+       
+       public AppManager getSource() {
+               return source;
+       }
+}


Property changes on: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedEvent.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Copied: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedListener.java
 (from rev 28769, 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppListener.java)
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedListener.java
                           (rev 0)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedListener.java
   2012-04-09 23:12:25 UTC (rev 28773)
@@ -0,0 +1,6 @@
+package org.cytoscape.app.internal.event;
+
+public interface AppsChangedListener {
+       
+       public void appsChanged(AppsChangedEvent event);
+}


Property changes on: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/event/AppsChangedListener.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Modified: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/App.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/App.java
 2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/App.java
 2012-04-09 23:12:25 UTC (rev 28773)
@@ -24,11 +24,6 @@
        private String entryClassName;
        
        /**
-        * The URL to the jar file containing the app.
-        */
-       private URL jarURL;
-       
-       /**
         * A reference to the instance of the app's class that extends {@link 
AbstractCyApp}.
         */
        private AbstractCyApp appInstance;
@@ -45,9 +40,9 @@
        private boolean officialNameObtained;
        
        /**
-        * Whether or not the app is a simple app as opposed to an OSGi 
bundle-based app.
+        * The type of app, such as simple or OSGi bundle-based app
         */
-       private boolean isSimpleApp;
+       private AppType appType;
        
        private AppStatus status;
        
@@ -71,6 +66,11 @@
                }
        }
        
+       public enum AppType {
+               SIMPLE_APP,
+               OSGI_APP;
+       }
+       
        public App() {
                this("", "", "", "", null);
        }
@@ -84,6 +84,7 @@
                
                appValidated = false;
                officialNameObtained = false;
+               this.status = AppStatus.UNINSTALLED;
        }
        
        public String getAppName() {
@@ -110,10 +111,6 @@
                return entryClassName;
        }
        
-       public URL getJarURL() {
-               return jarURL;
-       }
-
        public AbstractCyApp getAppInstance() {
                return appInstance;
        }
@@ -126,8 +123,8 @@
                return officialNameObtained;
        }
        
-       public boolean isSimpleApp() {
-               return isSimpleApp;
+       public AppType getAppType() {
+               return appType;
        }
        
        public AppStatus getStatus() {
@@ -158,10 +155,6 @@
                this.entryClassName = entryClassName;
        }
        
-       public void setJarURL(URL jarURL) {
-               this.jarURL = jarURL;
-       }
-       
        public void setAppInstance(AbstractCyApp appInstance) {
                this.appInstance = appInstance;
        }
@@ -174,27 +167,11 @@
                this.officialNameObtained = officialNameObtained;
        }
        
-       public void setSimpleApp(boolean isSimpleApp) {
-               this.isSimpleApp = isSimpleApp;
+       public void setAppType(AppType appType) {
+               this.appType = appType;
        }
        
        public void setStatus(AppStatus status) {
                this.status = status;
        }
-
-       @Override
-       public String toString() {
-               String result;
-               
-               result = "App: {name:" + appName + ", authors:" + authors + ", 
version:" + version + "}";
-               
-               return result;
-       }
-
-
-
-
-
-
-
 }

Modified: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
  2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppManager.java
  2012-04-09 23:12:25 UTC (rev 28773)
@@ -4,6 +4,7 @@
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.util.Collection;
@@ -14,11 +15,12 @@
 import org.apache.commons.io.FileUtils;
 import org.cytoscape.app.AbstractCyApp;
 import org.cytoscape.app.CyAppAdapter;
-import org.cytoscape.app.internal.event.AppEvent;
-import org.cytoscape.app.internal.event.AppListener;
+import org.cytoscape.app.internal.event.AppsChangedEvent;
+import org.cytoscape.app.internal.event.AppsChangedListener;
 import org.cytoscape.app.internal.exception.AppCopyException;
 import org.cytoscape.app.internal.exception.AppParsingException;
 import org.cytoscape.app.internal.manager.App.AppStatus;
+import org.cytoscape.app.internal.manager.App.AppType;
 import org.cytoscape.application.CyApplicationConfiguration;
 
 /**
@@ -43,8 +45,9 @@
        private Set<App> installedApps;
        private Set<App> toBeUninstalledApps;
        private Set<App> uninstalledApps;
+       private Set<App> availableApps;
        
-       private Set<AppListener> appListeners;
+       private Set<AppsChangedListener> appListeners;
        
        /** An {@link AppParser} object used to parse File objects and possibly 
URLs into {@link App} objects
         * into a format we can more easily work with
@@ -68,6 +71,7 @@
                installedApps = new HashSet<App>();
                toBeUninstalledApps = new HashSet<App>();
                uninstalledApps = new HashSet<App>();
+               availableApps = new HashSet<App>();
                
                appParser = new AppParser();
                
@@ -92,9 +96,15 @@
                }
                */
                
-               this.appListeners = new HashSet<AppListener>();
+               this.appListeners = new HashSet<AppsChangedListener>();
                
+               // Install previously enabled apps
                installAppsInDirectory(new File(getInstalledAppsPath()));
+               
+               // Load apps from the "uninstalled apps" directory
+               Set<App> uninstalledApps = obtainAppsFromDirectory(new 
File(getUninstalledAppsPath()));
+               availableApps.addAll(uninstalledApps);
+               uninstalledApps.addAll(uninstalledApps);
        }
        
        public AppParser getAppParser() {
@@ -107,7 +117,7 @@
         * app is created by instancing its class that extends {@link 
AbstractCyApp}.
         * 
         * Before the app is installed, it is checked if it contains valid 
packaging by its isAppValidated() method.
-        * Apps that have not been validated are ignored.
+        * Apps that have not been validated are ignored. Also, apps that are 
already installed are left alone.
         * 
         * @param app The {@link App} object representing and providing 
information about the app to install
         * @throws AppCopyException If there was an IO-related error during the 
copy operation that prevents the app from 
@@ -123,6 +133,13 @@
                        return;
                }
                
+               // Check if the app has already been installed.
+               if (app.getStatus() == AppStatus.INSTALLED && 
installedApps.contains(app)) {
+                       
+                       // Do nothing if it is already installed
+                       return;
+               }
+               
                // Attempt to copy the app to the directory for installed apps.
                try {
                        File installedAppsDirectory = new 
File(getInstalledAppsPath());
@@ -134,6 +151,12 @@
                                // Uses Apache Commons library; overwrites 
files with the same name.
                                FileUtils.copyFileToDirectory(appFile, 
installedAppsDirectory);
                                
+                               // If we copied it from the uninstalled apps 
directory, remove it from that directory
+                               if 
(appFile.getParentFile().getCanonicalPath().equals(getUninstalledAppsPath())) {
+                                       System.out.println("Installed from 
uninstalled apps directory, deleting from uninstalled directory");
+                                       appFile.delete();
+                               }
+                               
                                // Update the app's path
                                String fileName = app.getAppFile().getName();
                                app.setAppFile(new File(getInstalledAppsPath() 
+ File.separator + fileName));
@@ -141,10 +164,40 @@
                } catch (IOException e) {
                        throw new AppCopyException("Unable to copy file: " + 
e.getMessage());
                }
+       
+               // Create an app instance only if one was not already created
+               if (app.getAppType() == AppType.SIMPLE_APP 
+                               && app.getAppInstance() == null) {
+                       Object appInstance = createAppInstance(app);
+                       
+                       // Keep a reference to the newly created instance
+                       app.setAppInstance((AbstractCyApp) appInstance);
+               }
                
+               app.setStatus(AppStatus.INSTALLED);
+               System.out.println("App " + app + " status change: " + 
app.getStatus());
+               installedApps.add(app);
+               availableApps.add(app);
+               
+               // Let the listeners know that an app has been installed
+               for (AppsChangedListener appListener : appListeners) {
+                       AppsChangedEvent appEvent = new AppsChangedEvent(this);
+                       appListener.appsChanged(appEvent);
+               }
+       }
+       
+       private Object createAppInstance(App app) {
+               URL appURL = null;
+               try {
+                       appURL = app.getAppFile().toURI().toURL();
+               } catch (MalformedURLException e) {
+                       throw new IllegalStateException("Unable to obtain URL 
for file: " 
+                                       + app.getAppFile() + ". Reason: " + 
e.getMessage());
+               }
+               
                // TODO: Currently uses the CyAppAdapter's loader to load apps' 
classes. Is there reason to use a different one?
                ClassLoader appClassLoader = new URLClassLoader(
-                               new URL[]{app.getJarURL()}, 
appAdapter.getClass().getClassLoader());
+                               new URL[]{appURL}, 
appAdapter.getClass().getClassLoader());
                
                String entryClassName = app.getEntryClassName();
                
@@ -154,7 +207,7 @@
                         appEntryClass = 
appClassLoader.loadClass(entryClassName);
                } catch (ClassNotFoundException e) {
                        
-                       throw new IllegalStateException("Class " + 
entryClassName + " not found in URL: " + app.getJarURL());
+                       throw new IllegalStateException("Class " + 
entryClassName + " not found in URL: " + appURL);
                }
                
                // Attempt to obtain the constructor
@@ -180,18 +233,8 @@
                } catch (InvocationTargetException e) {
                        throw new RuntimeException(e);
                }
-
-               // Keep a reference to the newly created instance
-               app.setAppInstance((AbstractCyApp) appInstance);
-               app.setStatus(AppStatus.INSTALLED);
                
-               installedApps.add(app);
-               
-               // Let the listeners know that an app has been installed
-               for (AppListener appListener : appListeners) {
-                       AppEvent appEvent = new AppEvent(this, app);
-                       appListener.appInstalled(appEvent);
-               }
+               return appInstance;
        }
        
        /**
@@ -205,6 +248,8 @@
         * to the subdirectory containing currently uninstalled apps.
         */
        public void uninstallApp(App app) throws AppCopyException {
+               System.out.println("uninstallApp call, app: " + app + " status: 
" + app.getStatus());
+               
                // Check if the app is installed before attempting to uninstall.
                if (app.getStatus() != AppStatus.INSTALLED) {
                        // If it is not installed, do not attempt to uninstall 
it.
@@ -236,13 +281,12 @@
                                // Simple apps require a Cytoscape restart to 
be uninstalled
                                app.setStatus(AppStatus.TO_BE_UNINSTALLED);
                                
-                               installedApps.remove(app);
                                toBeUninstalledApps.add(app);
                                
                                // Let the listeners know that an app has been 
uninstalled
-                               for (AppListener appListener : appListeners) {
-                                       AppEvent appEvent = new AppEvent(this, 
app);
-                                       appListener.appUninstalled(appEvent);
+                               for (AppsChangedListener appListener : 
appListeners) {
+                                       AppsChangedEvent appEvent = new 
AppsChangedEvent(this);
+                                       appListener.appsChanged(appEvent);
                                }
                        }
                } catch (IOException e) {
@@ -252,13 +296,21 @@
        
        /**
         * Return the set of all currently installed apps.
-        * @return
+        * @return The set of all installed apps
         */
        public Set<App> getInstalledApps() {
                return installedApps;
        }
        
        /**
+        * Return the set of all locally available apps, including installed, 
uninstalled, and to-be-uninstalled apps.
+        * @return The set of all apps available to the app manager
+        */
+       public Set<App> getAvailableApps() {
+               return availableApps;
+       }
+       
+       /**
         * Return the path of the directory used to contain all apps.
         * @return The path of the root directory containing all installed and 
uninstalled apps.
         */
@@ -302,6 +354,30 @@
        
        private void installAppsInDirectory(File directory) {
 
+               // Parse App objects from the given directory
+               Set<App> parsedApps = obtainAppsFromDirectory(directory);
+               
+               // Install each app
+               for (App parsedApp : parsedApps) {
+                       try {
+                               installApp(parsedApp);
+                       } catch (AppCopyException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       }
+               }
+               
+               this.installedApps.addAll(parsedApps);
+               
+               System.out.println("Number of apps installed from directory: " 
+ parsedApps.size());
+       }
+       
+       /**
+        * Obtain a set of {@link App} objects through attempting to parse 
files found in the first level of the given directory.
+        * @param directory The directory used to parse {@link App} objects
+        * @return A set of all {@link App} objects that were successfully 
parsed from files in the given directory
+        */
+       private Set<App> obtainAppsFromDirectory(File directory) {
                // Obtain all files in the given directory with supported 
extensions, perform a non-recursive search
                Collection<File> files = FileUtils.listFiles(directory, 
APP_EXTENSIONS, false); 
                
@@ -323,18 +399,7 @@
                        }
                }
                
-               for (App parsedApp : parsedApps) {
-                       try {
-                               installApp(parsedApp);
-                       } catch (AppCopyException e) {
-                               // TODO Auto-generated catch block
-                               e.printStackTrace();
-                       }
-               }
-               
-               this.installedApps.addAll(parsedApps);
-               
-               System.out.println("Number of apps installed from directory: " 
+ parsedApps.size());
+               return parsedApps;
        }
        
        /**
@@ -363,11 +428,11 @@
                }
        }
        
-       public void addAppListener(AppListener appListener) {
+       public void addAppListener(AppsChangedListener appListener) {
                appListeners.add(appListener);
        }
        
-       public  void removeAppListener(AppListener appListener) {
+       public  void removeAppListener(AppsChangedListener appListener) {
                appListeners.remove(appListener);
        }
        

Modified: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/manager/AppParser.java
   2012-04-09 23:12:25 UTC (rev 28773)
@@ -8,6 +8,7 @@
 import java.util.jar.Manifest;
 
 import org.cytoscape.app.internal.exception.AppParsingException;
+import org.cytoscape.app.internal.manager.App.AppType;
 
 /**
  * This class represents an app parser that is capable of parsing given {@link 
File}
@@ -34,14 +35,6 @@
                        throw new AppParsingException("Error parsing given file 
as a jar file: " + e.getMessage());
                }
                
-               // Obtain the URL of the jar file
-               URL jarURL = null;
-               try {
-                       jarURL = file.toURI().toURL();
-               } catch (MalformedURLException e) {
-                       throw new AppParsingException("Failed to obtain jar 
URL: " + e.getMessage());
-               }
-               
                // Attempt to obtain manifest file from jar
                Manifest manifest = null;
                try {
@@ -61,9 +54,8 @@
                
                parsedApp.setAppFile(file);
                parsedApp.setEntryClassName(entryClassName);
-               parsedApp.setJarURL(jarURL);
                parsedApp.setAppValidated(true);
-               parsedApp.setSimpleApp(true);
+               parsedApp.setAppType(AppType.SIMPLE_APP);
                
                return parsedApp;
        }

Modified: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/CurrentlyInstalledAppsPanel.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/CurrentlyInstalledAppsPanel.java
      2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/CurrentlyInstalledAppsPanel.java
      2012-04-09 23:12:25 UTC (rev 28773)
@@ -1,9 +1,13 @@
 package org.cytoscape.app.internal.swing.main;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import javax.swing.table.DefaultTableModel;
 
-import org.cytoscape.app.internal.event.AppEvent;
-import org.cytoscape.app.internal.event.AppListener;
+import org.cytoscape.app.internal.event.AppsChangedEvent;
+import org.cytoscape.app.internal.event.AppsChangedListener;
+import org.cytoscape.app.internal.exception.AppCopyException;
 import org.cytoscape.app.internal.manager.App;
 import org.cytoscape.app.internal.manager.AppManager;
 
@@ -21,7 +25,7 @@
     private javax.swing.JLabel showTypeLabel;
        
     private AppManager appManager;
-    private AppListener appListener;
+    private AppsChangedListener appListener;
     
     public CurrentlyInstalledAppsPanel(AppManager appManager) {
         initComponents();
@@ -147,56 +151,75 @@
     }
 
     private void 
enableSelectedButtonActionPerformed(java.awt.event.ActionEvent evt) {
-        // TODO add your handling code here:
+        Set<App> selectedApps = getSelectedApps();
+        
+        for (App app : selectedApps) {
+               try {
+                               appManager.installApp(app);
+                       } catch (AppCopyException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       }
+        }
     }
 
     private void 
disableSelectedButtonActionPerformed(java.awt.event.ActionEvent evt) {
-        // TODO add your handling code here:
+       Set<App> selectedApps = getSelectedApps();
+        
+        for (App app : selectedApps) {
+               try {
+                               appManager.uninstallApp(app);
+                       } catch (AppCopyException e) {
+                               // TODO Auto-generated catch block
+                               e.printStackTrace();
+                       }
+        }
     }
 
     private void showTypeComboxBoxActionPerformed(java.awt.event.ActionEvent 
evt) {
         // TODO add your handling code here:
     }
     
+    private Set<App> getSelectedApps() {
+        Set<App> selectedApps = new HashSet<App>();
+       int[] selectedRows = appsAvailableTable.getSelectedRows();
+       
+        for (int index = 0; index < selectedRows.length; index++) {
+               App app = (App) 
appsAvailableTable.getModel().getValueAt(selectedRows[index], 0);
+               
+               selectedApps.add(app);
+        }
+       
+       return selectedApps;
+    }
+    
+    
     private void setupAppListener() {
-       appListener = new AppListener() {
+       appListener = new AppsChangedListener() {
 
                        @Override
-                       public void appInstalled(AppEvent event) {
+                       public void appsChanged(AppsChangedEvent event) {
                                
-                               // Prepare to add a new row containing the 
app's data to the table
+                               Set<App> selectedApps = getSelectedApps();
+                               
+                               // Clear table
                                DefaultTableModel tableModel = 
(DefaultTableModel) appsAvailableTable.getModel();
+                               for (int rowIndex = tableModel.getRowCount() - 
1; rowIndex >= 0; rowIndex--) {
+                                       tableModel.removeRow(rowIndex);
+                               }
                                
-                               App app = event.getApp();
-                               tableModel.addRow(new Object[]{
-                                               app,
-                                               app.getAppName(),
-                                               app.getVersion(),
-                                               app.getAuthors(),
-                                               app.getDescription(),
-                                               app.getStatus()
-                               });
-                               
+                               // Re-populate table
+                               populateTable();
+
+                               // Update labels
                                updateLabels();
-                       }
 
-                       @Override
-                       public void appUninstalled(AppEvent event) {
-                               
-                               // Prepare to remove the row containing the app 
from the table
-                               DefaultTableModel tableModel = 
(DefaultTableModel) appsAvailableTable.getModel();
-                               
-                               App app = event.getApp();
-                               int rowToBeRemoved = -1;
+                               // Re-select previously selected apps
                                for (int rowIndex = 0; rowIndex < 
tableModel.getRowCount(); rowIndex++) {
-                                       if (tableModel.getValueAt(rowIndex, 0) 
== app) {
-                                               rowToBeRemoved = rowIndex;
+                                       if 
(selectedApps.contains(tableModel.getValueAt(rowIndex, 0))) {
+                                               
appsAvailableTable.addRowSelectionInterval(rowIndex, rowIndex);
                                        }
                                }
-                               
-                               tableModel.removeRow(rowToBeRemoved);
-                               
-                               updateLabels();
                        }
        };
        
@@ -204,9 +227,9 @@
     }
     
     private void populateTable() {
-       System.out.println("populateTable() call, installed apps: " + 
appManager.getInstalledApps().size());
+       System.out.println("populateTable() call, avilable apps: " + 
appManager.getAvailableApps().size());
        
-       for (App app : appManager.getInstalledApps()) {
+       for (App app : appManager.getAvailableApps()) {
                DefaultTableModel tableModel = (DefaultTableModel) 
appsAvailableTable.getModel();
                
                tableModel.addRow(new Object[]{
@@ -224,6 +247,6 @@
     
     private void updateLabels() {
        
appsInstalledCountLabel.setText(String.valueOf(appManager.getInstalledApps().size()));
-       
appsAvailableCountLabel.setText(String.valueOf(appManager.getInstalledApps().size()));
+       
appsAvailableCountLabel.setText(String.valueOf(appManager.getAvailableApps().size()));
     }
 }

Modified: 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/InstallNewAppsPanel.java
===================================================================
--- 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/InstallNewAppsPanel.java
      2012-04-09 21:37:46 UTC (rev 28772)
+++ 
csplugins/trunk/toronto/yuedong/app_manager/impl/app-impl/src/main/java/org/cytoscape/app/internal/swing/main/InstallNewAppsPanel.java
      2012-04-09 23:12:25 UTC (rev 28773)
@@ -60,7 +60,7 @@
         searchLabel.setText("Search for Apps from the Web Store:");
 
         searchComboBox.setEditable(true);
-        searchComboBox.setModel(new javax.swing.DefaultComboBoxModel(new 
String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
+        searchComboBox.setModel(new javax.swing.DefaultComboBoxModel(new 
String[] {""}));
 
         searchButton.setText("Search");
         searchButton.addActionListener(new java.awt.event.ActionListener() {

-- 
You received this message because you are subscribed to the Google Groups 
"cytoscape-cvs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/cytoscape-cvs?hl=en.

Reply via email to