Author: paperwing
Date: 2012-08-31 08:53:59 -0700 (Fri, 31 Aug 2012)
New Revision: 30303

Modified:
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/AppManagerDialog.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSite.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSitesManager.java
   
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/ManageDownloadSitesDialog.java
Log:
refs #1272 Now has support for saving/loading set of app store sites, choosing 
between them, and using them for updates

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
 2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/CyActivator.java
 2012-08-31 15:53:59 UTC (rev 30303)
@@ -14,6 +14,7 @@
 import org.cytoscape.app.internal.net.server.ScreenOriginsBeforeResponse;
 import 
org.cytoscape.app.internal.net.server.AddAccessControlAllowOriginHeaderAfterResponse;
 import org.cytoscape.app.internal.net.server.OriginOptionsBeforeResponse;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
 import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
 import org.cytoscape.app.swing.CySwingAppAdapter;
 import org.cytoscape.application.CyVersion;
@@ -396,6 +397,12 @@
                
                // Fire event "start up mostly finished". This seems to close 
the Cytoscape splash screen and show the actual UI.
                cyEventHelperRef.fireEvent(new CyStartEvent(this));
+               
+               /*
+               for (DownloadSite site : WebQuerier.DEFAULT_DOWNLOAD_SITES) {
+                       System.out.println(site.getSiteName());
+               }
+               */
        }
 }
 

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/UpdateManager.java
   2012-08-31 15:53:59 UTC (rev 30303)
@@ -39,7 +39,7 @@
                this.updatesChangedListeners = new 
HashSet<UpdatesChangedListener>();
                this.updates = null;
                
-               lastUpdateCheckTime = 
Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
+               lastUpdateCheckTime = null;
        }
        
        /**
@@ -53,10 +53,10 @@
                
                this.updates = potentialUpdates;
                
-               fireUpdatesChangedEvent();
-               
                // Update last update check time
                lastUpdateCheckTime = 
Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
+               
+               fireUpdatesChangedEvent();
        }
        
        public Set<Update> getUpdates() {

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
      2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/net/WebQuerier.java
      2012-08-31 15:53:59 UTC (rev 30303)
@@ -30,6 +30,7 @@
 import org.cytoscape.app.internal.manager.AppParser.ChecksumException;
 import org.cytoscape.app.internal.net.WebApp.Release;
 import org.cytoscape.app.internal.net.WebQuerier.AppTag;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
 import org.cytoscape.app.internal.util.DebugHelper;
 import org.cytoscape.io.util.StreamUtil;
 import org.json.JSONArray;
@@ -44,6 +45,20 @@
  */
 public class WebQuerier {
        
+       public static final List<DownloadSite> DEFAULT_DOWNLOAD_SITES = new 
LinkedList<DownloadSite>();
+       
+       static {
+               DownloadSite site = new DownloadSite();
+               site.setSiteName("Cytoscape App Store Beta");
+               site.setSiteUrl("http://apps3.nrnb.org/";);
+               DEFAULT_DOWNLOAD_SITES.add(site);
+               
+               site = new DownloadSite();
+               site.setSiteName("Cytoscape App Store");
+               site.setSiteUrl("http://apps.cytoscape.org/";);
+               DEFAULT_DOWNLOAD_SITES.add(site);
+       }
+       
        private static final String DEFAULT_APP_STORE_URL = 
"http://apps3.nrnb.org/";;
        
        private static final String REQUEST_JSON_HEADER_KEY = 
"X-Requested-With";
@@ -226,7 +241,6 @@
                                currentAppStoreUrl = url;
                        }
                        
-                       
                        if (appsByUrl.get(currentAppStoreUrl) == null) {
                                appsByUrl.put(currentAppStoreUrl, null);
                        }
@@ -511,7 +525,7 @@
                                    long bytesTransferred;
                                    
                                    do {
-                                       bytesTransferred = 
fileChannel.transferFrom(readableByteChannel, currentDownloadPosition, 1 << 20);
+                                       bytesTransferred = 
fileChannel.transferFrom(readableByteChannel, currentDownloadPosition, 1 << 24);
 //                                     System.out.println("Position: " + 
currentDownloadPosition + " new bytes: " + bytesTransferred);
                                        currentDownloadPosition += 
bytesTransferred;
                                    } while (bytesTransferred > 0);

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/AppManagerDialog.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/AppManagerDialog.java
 2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/AppManagerDialog.java
 2012-08-31 15:53:59 UTC (rev 30303)
@@ -34,6 +34,7 @@
         super(parent, modal);
         
         this.appManager = appManager;
+        this.downloadSitesManager = downloadSitesManager;
         this.fileUtil = fileUtil;
         this.taskManager = taskManager;
         initComponents();
@@ -49,9 +50,9 @@
    
     private void initComponents() {
        mainTabbedPane = new javax.swing.JTabbedPane();
-        installNewAppsPanel1 = new InstallFromStorePanel(appManager, fileUtil, 
taskManager, this);
+        installNewAppsPanel1 = new InstallFromStorePanel(appManager, 
downloadSitesManager, fileUtil, taskManager, this);
         currentlyInstalledAppsPanel1 = new 
CurrentlyInstalledAppsPanel(appManager);
-        checkForUpdatesPanel1 = new CheckForUpdatesPanel(appManager, 
taskManager, this);
+        checkForUpdatesPanel1 = new CheckForUpdatesPanel(appManager, 
downloadSitesManager, taskManager, this);
 
         setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
         setTitle("App Manager");

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
     2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/CheckForUpdatesPanel.java
     2012-08-31 15:53:59 UTC (rev 30303)
@@ -20,6 +20,11 @@
 import org.cytoscape.app.internal.manager.AppManager;
 import org.cytoscape.app.internal.net.Update;
 import org.cytoscape.app.internal.net.UpdateManager;
+import org.cytoscape.app.internal.net.WebApp;
+import org.cytoscape.app.internal.net.WebQuerier;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
+import org.cytoscape.app.internal.ui.downloadsites.ManageDownloadSitesDialog;
 import org.cytoscape.work.Task;
 import org.cytoscape.work.TaskIterator;
 import org.cytoscape.work.TaskManager;
@@ -50,11 +55,16 @@
     
     private UpdateManager updateManager;
     private AppManager appManager;
+    private DownloadSitesManager downloadSitesManager;
     private TaskManager taskManager;
     
-    public CheckForUpdatesPanel(AppManager appManager, TaskManager 
taskManager, Container parent) {
+    public CheckForUpdatesPanel(AppManager appManager, 
+               DownloadSitesManager downloadSitesManager, 
+               TaskManager taskManager, Container parent) {
+       
        this.updateManager = new UpdateManager();
         this.appManager = appManager;
+        this.downloadSitesManager = downloadSitesManager;
         this.taskManager = taskManager;
        
        initComponents();
@@ -221,7 +231,7 @@
                @Override
                public void componentShown(ComponentEvent e) {
                        
-                       Set<App> appsToCheckUpdates = new HashSet<App>();
+                       final Set<App> appsToCheckUpdates = new HashSet<App>();
                        
                        for (App app : appManager.getApps()) {
                                if (app.getStatus() == AppStatus.INSTALLED
@@ -230,11 +240,55 @@
                                }
                        }
                        
-                       
updateManager.checkForUpdates(appManager.getWebQuerier(), 
-                                       appsToCheckUpdates, 
-                                       appManager);
+                       taskManager.execute(new TaskIterator(new Task() {
+                                       
+                                       @Override
+                                       public void run(TaskMonitor 
taskMonitor) throws Exception {
+
+                                               taskMonitor.setTitle("Checking 
for updates");
+                                               
+                                               WebQuerier webQuerier = 
appManager.getWebQuerier();
+                                               
+                                               String siteName, siteUrl;
+                                               
+                                               double progress = 0.0;
+                                               
+//                                             System.out.println("dlsite mgr: 
" + downloadSitesManager);
+//                                             System.out.println("dlsite 
mgr's sites: " + downloadSitesManager.getDownloadSites());
+                                               
+                                               // Obtain apps listing from 
each site if not done so
+                                               for (DownloadSite downloadSite 
: downloadSitesManager.getDownloadSites()) {
+                                                       
+                                                       siteName = 
downloadSite.getSiteName();
+                                                       siteUrl = 
downloadSite.getSiteUrl();
+                                                       
+                                                       
taskMonitor.setStatusMessage("Obtaining apps listing from " 
+                                                                       + 
siteName + "(" + siteUrl + ") ...");
+                                                       
taskMonitor.setProgress(progress);
+                                                       
+                                                       progress += 1.0 / 
(downloadSitesManager.getDownloadSites().size() + 1);
+                                                       
+                                                       
webQuerier.setCurrentAppStoreUrl(siteUrl);
+                                                       Set<WebApp> webApps = 
webQuerier.getAllApps();
+                                               }
+                                               
+                                               
taskMonitor.setStatusMessage("Reading listings for new versions");
+                                               taskMonitor.setProgress(0.98); 
// We're 98% done.
+                                               
+                                               
updateManager.checkForUpdates(appManager.getWebQuerier(), 
+                                                       appsToCheckUpdates, 
+                                                       appManager);
+                                       }
+                                       
+                                       @Override
+                                       public void cancel() {
+                                               // TODO Auto-generated method 
stub
+                                               
+                                       }
+                               }));
                        
-                       }
+                       
+               }
         });
         
         setupDescriptionListener();

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
    2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/InstallFromStorePanel.java
    2012-08-31 15:53:59 UTC (rev 30303)
@@ -20,6 +20,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
+import java.util.Vector;
 
 import javax.swing.ComboBoxEditor;
 import javax.swing.DefaultComboBoxModel;
@@ -49,6 +50,10 @@
 import org.cytoscape.app.internal.net.WebApp;
 import org.cytoscape.app.internal.net.WebQuerier;
 import org.cytoscape.app.internal.net.WebQuerier.AppTag;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSite;
+import org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager;
+import 
org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager.DownloadSitesChangedEvent;
+import 
org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager.DownloadSitesChangedListener;
 import org.cytoscape.app.internal.util.DebugHelper;
 import org.cytoscape.util.swing.FileChooserFilter;
 import org.cytoscape.util.swing.FileUtil;
@@ -88,6 +93,7 @@
        private JFileChooser fileChooser;
        
        private AppManager appManager;
+       private DownloadSitesManager downloadSitesManager;
        private FileUtil fileUtil;
        private TaskManager taskManager;
        private Container parent;
@@ -97,8 +103,11 @@
        
        private Set<WebApp> resultsTreeApps;
        
-    public InstallFromStorePanel(final AppManager appManager, FileUtil 
fileUtil, TaskManager taskManager, Container parent) {
+    public InstallFromStorePanel(final AppManager appManager, 
+               DownloadSitesManager downloadSitesManager, 
+               FileUtil fileUtil, TaskManager taskManager, Container parent) {
         this.appManager = appManager;
+        this.downloadSitesManager = downloadSitesManager;
         this.fileUtil = fileUtil;
         this.taskManager = taskManager;
         this.parent = parent;
@@ -122,6 +131,7 @@
                });
                
                setupTextFieldListener();
+       setupDownloadSitesChangedListener();
        
                queryForApps();
                
@@ -140,6 +150,29 @@
                });
     }
     
+    private void setupDownloadSitesChangedListener() {
+    
+       downloadSitesManager.addDownloadSitesChangedListener(new 
DownloadSitesChangedListener() {
+                       
+                       @Override
+                       public void downloadSitesChanged(
+                                       DownloadSitesChangedEvent 
downloadSitesChangedEvent) {
+                               
+                               final DefaultComboBoxModel defaultComboBoxModel 
= new DefaultComboBoxModel(
+                                               new 
Vector<DownloadSite>(downloadSitesManager.getDownloadSites()));
+                               
+                               SwingUtilities.invokeLater(new Runnable() {
+                                       
+                                       @Override
+                                       public void run() {
+                                               
downloadSiteComboBox.setModel(defaultComboBoxModel);
+                                       }
+                               });
+                               
+                       }
+               });
+    }
+    
     // Queries the currently set app store url for available apps.
     private void queryForApps() {
        taskManager.execute(new TaskIterator(new Task() {
@@ -150,7 +183,8 @@
                                WebQuerier webQuerier = 
appManager.getWebQuerier();
                        
                                taskMonitor.setTitle("Getting available apps");
-                               taskMonitor.setStatusMessage("Obtaining apps 
from: " + webQuerier.getCurrentAppStoreUrl());
+                               taskMonitor.setStatusMessage("Obtaining apps 
from: " 
+                                               + 
webQuerier.getCurrentAppStoreUrl());
                                
                                Set<WebApp> availableApps = 
webQuerier.getAllApps();
                        
@@ -269,7 +303,6 @@
 
         downloadSiteLabel.setText("Download Site:");
 
-        downloadSiteComboBox.setEditable(true);
         downloadSiteComboBox.setModel(new javax.swing.DefaultComboBoxModel(new 
String[] { "http://apps3.nrnb.org/";, "http://apps.cytoscape.org/"; }));
         downloadSiteComboBox.addItemListener(new java.awt.event.ItemListener() 
{
             public void itemStateChanged(java.awt.event.ItemEvent evt) {

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSite.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSite.java
       2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSite.java
       2012-08-31 15:53:59 UTC (rev 30303)
@@ -12,7 +12,7 @@
        
        /** The site's url.
         */
-       private String siteUrl; 
+       private String siteUrl;
        
        public DownloadSite() {
                this.siteName = "";
@@ -39,4 +39,18 @@
        public String toString() {
                return this.siteName;
        }
+       
+       /**
+        * Returns true if the given site has same name and Url.
+        * @param downloadSite Other site
+        * @return <code>true</code> if other site has same name and Url, 
<code>false</code> otherwise.
+        */
+       public boolean sameSiteAs(DownloadSite downloadSite) {
+               if (downloadSite.siteName.equals(this.siteName)
+                               && downloadSite.siteUrl.equals(this.siteUrl)) {
+                       return true;
+               } else {
+                       return false;
+               }
+       }
 }

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSitesManager.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSitesManager.java
       2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/DownloadSitesManager.java
       2012-08-31 15:53:59 UTC (rev 30303)
@@ -1,6 +1,7 @@
 package org.cytoscape.app.internal.ui.downloadsites;
 
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
@@ -75,6 +76,42 @@
                                }
                        }
                        
+                       // Remove extra entries
+                       boolean isExtraKey;
+                       
+                       Set<Object> keysToRemove = new HashSet<Object>();
+                       
+                       for (Object key : cyProperty.getProperties().keySet()) {
+                               
+                               if (key instanceof String) {
+                                       String keyString = (String) key;
+
+                                       siteNumber = 0;
+                                       isExtraKey = false;
+                                       
+                                       try {
+                                               if 
(keyString.startsWith(DOWNLOAD_SITE_NAME_KEY_PREFIX)) {
+                                                       siteNumber = 
Integer.parseInt(keyString.substring(DOWNLOAD_SITE_NAME_KEY_PREFIX.length()).trim());
+                                               }
+                                               
+                                               if 
(keyString.startsWith(DOWNLOAD_SITE_URL_KEY_PREFIX)) {
+                                                       siteNumber = 
Integer.parseInt(keyString.substring(DOWNLOAD_SITE_URL_KEY_PREFIX.length()).trim());
+                                               }
+                                       } catch (NumberFormatException e) {
+                                               siteNumber = 0;
+                                       }
+                                       
+                                       if (siteNumber >= downloadSiteCount + 
1) {
+                                               isExtraKey = true;
+                                               keysToRemove.add(key);
+                                       }
+                               }
+                       }
+                       
+                       for (Object keyToRemove : keysToRemove) {
+                               cyProperty.getProperties().remove(keyToRemove);
+                       }
+                       
                        this.downloadSites = newDownloadSites;
                        
                        return true;
@@ -139,6 +176,7 @@
         * Notify listeners that a site has been added, removed, or has its 
fields changed
         */
        public void notifyDownloadSitesChanged() {
+               
                DownloadSitesChangedEvent event = new 
DownloadSitesChangedEvent(this);
                
                for (DownloadSitesChangedListener listener : 
this.downloadSitesChangedListeners) {

Modified: 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/ManageDownloadSitesDialog.java
===================================================================
--- 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/ManageDownloadSitesDialog.java
  2012-08-31 00:35:10 UTC (rev 30302)
+++ 
core3/impl/trunk/app-impl/src/main/java/org/cytoscape/app/internal/ui/downloadsites/ManageDownloadSitesDialog.java
  2012-08-31 15:53:59 UTC (rev 30303)
@@ -15,6 +15,7 @@
 
 import org.cytoscape.app.internal.manager.App;
 import org.cytoscape.app.internal.net.Update;
+import org.cytoscape.app.internal.net.WebQuerier;
 import 
org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager.DownloadSitesChangedEvent;
 import 
org.cytoscape.app.internal.ui.downloadsites.DownloadSitesManager.DownloadSitesChangedListener;
 
@@ -59,9 +60,6 @@
                        }
                };
                
-        downloadSitesManager.addDownloadSitesChangedListener(
-                       downloadSitesChangedListener);
-        
         DownloadSite site1 = new DownloadSite();
         site1.setSiteName("site1");
         site1.setSiteUrl("url1");
@@ -74,6 +72,23 @@
         site3.setSiteName("site3");
         site3.setSiteUrl("url3");
         
+        downloadSitesManager.loadDownloadSites();
+        
+        // System.out.println("Sites loaded, count: " + 
downloadSitesManager.getDownloadSites().size());
+        if (downloadSitesManager.getDownloadSites().size() == 0) {
+               for (DownloadSite downloadSite : 
WebQuerier.DEFAULT_DOWNLOAD_SITES) {
+                       downloadSitesManager.addDownloadSite(downloadSite);
+               }
+        
+               // System.out.println("Sites added, count: " + 
downloadSitesManager.getDownloadSites().size());
+               downloadSitesManager.saveDownloadSites();
+        }
+
+        downloadSitesManager.addDownloadSitesChangedListener(
+                       downloadSitesChangedListener);
+        
+        repopulateTable();
+        
         /*
         downloadSitesManager.addDownloadSite(site1);
         downloadSitesManager.addDownloadSite(site2);
@@ -242,7 +257,9 @@
        }
        
        downloadSitesManager.addDownloadSite(downloadSite);
-       
+
+               downloadSitesManager.saveDownloadSites();
+               
        if (sitesTable.getModel() instanceof DefaultTableModel) {
                
                // Make the added site selected
@@ -293,12 +310,17 @@
        
        if (downloadSite == null) {
                JOptionPane.showMessageDialog(this, "Select a site to edit it");
-       } else {
+       } else if (isLastCopyOfDefaultSite(downloadSite)) {
+               JOptionPane.showMessageDialog(this, "That is a default site, 
cannot edit");
+               
+       } else {                
                downloadSite.setSiteName(getEnteredSiteName());
                downloadSite.setSiteUrl(getEnteredUrl());
                
                // Tell the manager one of its sites changed
                downloadSitesManager.notifyDownloadSitesChanged();
+
+               downloadSitesManager.saveDownloadSites();
        }
     }
 
@@ -307,6 +329,11 @@
         
         if (downloadSite == null) {
                JOptionPane.showMessageDialog(this, "Select a site to remove 
it");
+        
+        // If it is the last copy of a default download site, don't allow 
removing it
+        } else if (isLastCopyOfDefaultSite(downloadSite)) {
+               JOptionPane.showMessageDialog(this, "That is a default site, 
cannot remove");
+               
         } else {
                final int selectionIndex = sitesTable.getSelectedRow();
                
@@ -322,6 +349,8 @@
                
                if (siteToRemove != null) {
                        downloadSitesManager.removeDownloadSite(siteToRemove);
+
+                       downloadSitesManager.saveDownloadSites();
                        
                        SwingUtilities.invokeLater(new Runnable() {
                                        
@@ -339,10 +368,41 @@
                                                }
                                        }
                                });
+                       
                }
         }
     }
 
+    /**
+     * Checks if a download site corresponds to the last copy of a default site
+     * in the {@link DownloadSitesManager}.
+     * @param downloadSite The site used to perform the check
+     * @return Whether the site corresponds to the last copy of a default site
+     * in the {@link DownloadSitesManager}
+     */
+    private boolean isLastCopyOfDefaultSite(DownloadSite downloadSite) {
+       boolean isDefaultSite = false;
+               int copiesOfSite = 0;
+               
+               // Don't allow editing if it's one of default sites, and it's 
the last
+               // copy of that default site
+               for (DownloadSite defaultSite : 
WebQuerier.DEFAULT_DOWNLOAD_SITES) {
+                       if (downloadSite.sameSiteAs(defaultSite)) {
+                               isDefaultSite = true;
+                       }
+               }
+               
+               if (isDefaultSite) {
+               for (DownloadSite registeredSite : 
downloadSitesManager.getDownloadSites()) {
+                       if (registeredSite.sameSiteAs(downloadSite)) {
+                               copiesOfSite++;
+                       }
+               }
+               }
+               
+               return (isDefaultSite && copiesOfSite <= 1);
+    }
+    
     private void siteUrlTextFieldActionPerformed(java.awt.event.ActionEvent 
evt) {
     }
     
@@ -395,7 +455,7 @@
                        public void run() {
                        sitesTable.setModel(tableModel);
                        
-                       
sitesTable.getColumnModel().getColumn(0).setPreferredWidth(80);
+                       
sitesTable.getColumnModel().getColumn(0).setPreferredWidth(140);
                        
sitesTable.getColumnModel().getColumn(1).setPreferredWidth(285);
                        
                        listedSitesLabel.setText("Listed sites: " + 
downloadSites.size());

-- 
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