/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
*
* Oracle and Java are registered trademarks of Oracle and/or its affiliates.
* Other names may be trademarks of their respective owners.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common
* Development and Distribution License("CDDL") (collectively, the
* "License"). You may not use this file except in compliance with the
* License. You can obtain a copy of the License at
* http://www.netbeans.org/cddl-gplv2.html
* or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
* specific language governing permissions and limitations under the
* License. When distributing the software, include this License Header
* Notice in each file and include the License file at
* nbbuild/licenses/CDDL-GPL-2-CP. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the GPL Version 2 section of the License file that
* accompanied this code. If applicable, add the following below the
* License Header, with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* Contributor(s):
*
* The Original Software is NetBeans. The Initial Developer of the Original
* Software is Sun Microsystems, Inc. Portions Copyright 1997-2008 Sun
* Microsystems, Inc. All Rights Reserved.
*
* If you wish your version of this file to be governed by only the CDDL
* or only the GPL Version 2, indicate your decision by adding
* "[Contributor] elects to include this software in this distribution
* under the [CDDL or GPL Version 2] license." If you do not indicate a
* single choice of license, a recipient has the option to distribute
* your version of this file under either the CDDL, the GPL Version 2 or
* to extend the choice of license to its licensees as provided above.
* However, if you add GPL Version 2 code and therefore, elected the GPL
* Version 2 license, then the option applies only if the new code is
* made subject to such option by the copyright holder.
*/
package org.netbeans.modules.ruby.platform.gems;
import java.awt.Component;
import java.awt.EventQueue;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import javax.swing.JTextPane;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import org.netbeans.api.options.OptionsDisplayer;
import org.netbeans.api.ruby.platform.RubyPlatform;
import org.netbeans.modules.ruby.platform.PlatformComponentFactory;
import org.netbeans.modules.ruby.platform.RubyPlatformCustomizer;
import org.netbeans.modules.ruby.platform.RubyPreferences;
import org.netbeans.modules.ruby.platform.Util;
import org.netbeans.modules.ruby.platform.gems.GemUISupport.GemListRenderer;
import org.openide.DialogDescriptor;
import org.openide.DialogDisplayer;
import org.openide.NotifyDescriptor;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
import static org.netbeans.modules.ruby.platform.gems.GemPanel.TabIndex.*;
/**
* Provides UI for managing RubyGems like CLI <tt>gem</tt> tool does, albeit not
* so feature-full.
*/
public final class GemPanel extends JPanel {
private static final Logger LOGGER = Logger.getLogger(GemPanel.class.getName());
/** Preference key for storing lastly used directory when installing new gem. */
private static final String LAST_GEM_DIRECTORY = "lastLocalGemDirectory"; // NOI18N
/** Preference key for storing lastly selected platform. */
private static final String LAST_PLATFORM_ID = "gemPanelLastPlatformID"; // NOI18N
static enum TabIndex {
UPDATED(0, "GemPanel.updatedPanel.TabConstraints.tabTitle"), // NOI18N
INSTALLED(1, "GemPanel.installedPanel.TabConstraints.tabTitle"), // NOI18N
NEW(2, "GemPanel.newPanel.TabConstraints.tabTitle"); // NOI18N
private final int position;
private final String title;
TabIndex(final int position, final String titleKey) {
this.position = position;
this.title = getMessage(titleKey);
}
private int getPosition() { return position; }
private String getTitle() { return title; }
}
private RequestProcessor updateTasksQueue;
/** Whether this dialog is closed. */
private boolean closed;
/** see {@link #isModified} */
private boolean gemsModified;
/** Current gems filter. */
private String filter;
/** Listens on filter fields. */
private FilterFieldListener sfl;
/** For {@link #filterTask}. */
private static final RequestProcessor FILTER_PROCESSOR =
new RequestProcessor("rubygems-filter-processor"); // NOI18N
/** Used to schedule application of filter. */
private final RequestProcessor.Task filterTask;
/** Empty non-modifiable Gem list model. */
private final GemListModel emptyGemListModel;
/**
* @param initialFilter the filter to use for displaying gems, e.g.
* <code>"generators$"</code> for displaying only generator gems.
*/
public GemPanel(final String initialFilter) {
this(initialFilter, null, true);
}
/**
* @param initialFilter the filter to use for displaying gems, e.g.
* <code>"generators$"</code> for displaying only generator gems.
* @param preselected the platform that should be preselected in the panel;
* may be <code>null</code> in which case the last selected platform
* is preselected.
* @param canManagePlatforms whether the "Manage Platform" button is
* visible. Is used when Gem Manager was called from Platform
* Customizer to prevent creation of another Platform Customizer.
*/
public GemPanel(final String initialFilter,
final RubyPlatform preselected,
final boolean canManagePlatforms) {
emptyGemListModel = new GemListModel(Collections.<Gem>emptyList(), null);
updateTasksQueue = new RequestProcessor("Gem Updater", 5); // NOI18N
filterTask = FILTER_PROCESSOR.create(new Runnable() {
public void run() {
EventQueue.invokeLater(new Runnable() {
public void run() {
applyFilter();
}
});
}
});
initComponents();
if (!canManagePlatforms) {
manageButton.setVisible(false);
}
oldRubyGemsText.setForeground(UIManager.getColor("nb.errorForeground"));
if (preselected == null) {
Util.preselectPlatform(platforms, LAST_PLATFORM_ID);
} else {
platforms.setSelectedItem(preselected);
}
GemManager gemManager = getGemManager();
if (gemManager != null) {
allVersionsCheckbox.setSelected(!gemManager.hasAncientRubyGemsVersion() &&
RubyPreferences.shallFetchAllVersions());
}
descriptionCheckbox.setSelected(RubyPreferences.shallFetchGemDescriptions());
installedList.setCellRenderer(new GemListRenderer());
installedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
installedList.getSelectionModel().addListSelectionListener(new MyListSelectionListener(installedList, installedDesc, uninstallButton));
newList.setCellRenderer(new GemListRenderer());
newList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
newList.getSelectionModel().addListSelectionListener(new MyListSelectionListener(newList, newDesc, installButton));
updatedList.setCellRenderer(new GemListRenderer());
updatedList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
updatedList.getSelectionModel().addListSelectionListener(new MyListSelectionListener(updatedList, updatedDesc, updateButton));
PlatformComponentFactory.addPlatformChangeListener(platforms, new PlatformComponentFactory.PlatformChangeListener() {
public void platformChanged() {
GemPanel.this.platformChanged();
}
});
platformChanged();
if (initialFilter != null) {
setFilter(initialFilter);
gemsTab.setSelectedIndex(NEW.getPosition());
applyFilter();
} else {
gemsTab.setSelectedIndex(INSTALLED.getPosition());
}
verboseCheckBox.setSelected(RubyPreferences.isGemVerboseOutput());
}
private void platformChanged() {
assert EventQueue.isDispatchThread();
// cancel current update, the platform was changed
cancelRunningTasks();
boolean paltformsAreBeingLoaded = PlatformComponentFactory.isLoadingPlatforms(platforms);
RubyPlatform platform = getSelectedPlatform();
if (paltformsAreBeingLoaded || platform == null || !platform.isValid() || !platform.hasRubyGemsInstalled()) {
if (!paltformsAreBeingLoaded) {
gemHomeValue.setForeground(PlatformComponentFactory.INVALID_PLAF_COLOR);
gemHomeValue.setText(platform == null
? getMessage("GemPanel.select.valid.platform")
: GemManager.getNotInstalledMessage());
}
updateList(INSTALLED, Collections.<Gem>emptyList());
updateList(NEW, Collections.<Gem>emptyList());
updateList(UPDATED, Collections.<Gem>emptyList());
setEnabledGUI(false);
hideProgressBars();
oldRubyGemsText.setVisible(false);
return;
}
GemManager gemManager = getGemManager();
oldRubyGemsText.setVisible(gemManager.hasOldRubyGemsVersion());
if (gemManager.hasOldRubyGemsVersion()) {
oldRubyGemsText.setText(getMessage("GemPanel.oldRubyGems.warning", gemManager.getRubyGemsVersion()));
}
assert gemManager != null : "gemManager must not be null";
allVersionsCheckbox.setEnabled(!gemManager.hasAncientRubyGemsVersion());
gemHomeValue.setText(getGemManager().getGemHome());
gemHomeValue.setForeground(UIManager.getColor("Label.foreground")); // NOI18N
refreshAllGems();
}
public void setFilter(String filter) {
assert EventQueue.isDispatchThread();
this.filter = filter;
}
public String getFilter() {
assert EventQueue.isDispatchThread();
return filter;
}
public @Override void addNotify() {
super.addNotify();
this.sfl = new FilterFieldListener();
addFilterDocumentListeners();
}
private void addFilterDocumentListeners() {
searchInstText.getDocument().addDocumentListener(sfl);
searchNewText.getDocument().addDocumentListener(sfl);
searchUpdatedText.getDocument().addDocumentListener(sfl);
}
private void removeFilterDocumentListeners() {
searchInstText.getDocument().removeDocumentListener(sfl);
searchNewText.getDocument().removeDocumentListener(sfl);
searchUpdatedText.getDocument().removeDocumentListener(sfl);
}
public @Override void removeNotify() {
closed = true;
removeFilterDocumentListeners();
cancelRunningTasks();
if (getSelectedPlatform() != null) {
RubyPreferences.getPreferences().put(LAST_PLATFORM_ID, getSelectedPlatform().getID());
}
super.removeNotify();
}
private void cancelRunningTasks() {
LOGGER.finer("Cancelling all running GemPanel tasks");
// TODO: implement
}
private static void updateGemDescription(final JList list, final JTextPane pane, final JButton button) {
Object o = list.getSelectedValue();
if (o instanceof Gem) { // Could be "Please Wait..." String
button.setEnabled(true);
if (pane != null) {
updateGemDescription(pane, (Gem) o);
}
return;
} else {
if (pane != null) {
pane.setText("");
}
button.setEnabled(false);
}
}
private static void updateGemDescription(JTextPane pane, Gem gem) {
assert EventQueue.isDispatchThread();
if (gem == null) {
pane.setText("");
return;
}
String htmlMimeType = "text/html"; // NOI18N
pane.setContentType(htmlMimeType);
pane.setText(GemUISupport.getGemHTMLDescriptionForTextPane(gem));
pane.setCaretPosition(0);
}
private void setEnabledGUI(boolean enabled) {
setEnabledLocalsGUI(enabled);
setEnabledRemoteGUI(enabled);
}
private void setEnabledLocalsGUI(boolean enabled) {
setEnabled(INSTALLED, enabled);
}
private void setEnabledRemoteGUI(boolean enabled) {
setEnabled(NEW, enabled);
setEnabled(UPDATED, enabled);
}
private void enableLocalReloadGUI() {
reloadInstalledButton.setEnabled(true);
}
private void enableRemoteReloadGUI() {
reloadNewButton.setEnabled(true);
reloadUpdatedButton.setEnabled(true);
}
private void setEnabled(TabIndex tab, boolean enabled) {
switch (tab) {
case NEW:
reloadNewButton.setEnabled(enabled);
if (!enabled) { // decided by list selection
installButton.setEnabled(enabled);
}
installLocalButton.setEnabled(enabled);
newPanel.setEnabled(enabled);
newList.setEnabled(enabled);
newSP.setEnabled(enabled);
searchNewLbl.setEnabled(enabled);
searchNewText.setEnabled(enabled);
break;
case UPDATED:
if (!enabled) { // decided by list selection
updateButton.setEnabled(enabled);
}
updateAllButton.setEnabled(enabled);
reloadUpdatedButton.setEnabled(enabled);
updatedPanel.setEnabled(enabled);
updatedList.setEnabled(enabled);
updatedSP.setEnabled(enabled);
searchUpdatedLbl.setEnabled(enabled);
searchUpdatedText.setEnabled(enabled);
break;
case INSTALLED:
reloadInstalledButton.setEnabled(enabled);
if (!enabled) { // decided by list selection
uninstallButton.setEnabled(enabled);
}
installedPanel.setEnabled(enabled);
installedList.setEnabled(enabled);
installedSP.setEnabled(enabled);
searchInstLbl.setEnabled(enabled);
searchInstText.setEnabled(enabled);
break;
default:
throw new IllegalArgumentException("Unknonw tab: " + tab); // NOI18N
}
boolean everythingDone = newPanel.isEnabled() && updatedPanel.isEnabled() && installedPanel.isEnabled();
// allow certain actions only when all tabs are updated
browseGemHome.setEnabled(everythingDone);
}
private synchronized void notifyLocalGemsUpdated() {
assert EventQueue.isDispatchThread();
GemManager gemManager = getGemManager();
assert gemManager != null : "gemManager must not be null";
assert !gemManager.needsLocalReload() : "local gems are ready";
LOGGER.finer("Updating local gems UI for: " + gemManager);
hideLocalProgressBars();
List<Gem> local = gemManager.getLocalGems();
updateList(INSTALLED, local);
refreshGemsToUpdate();
}
private synchronized void notifyRemoteGemsUpdated() {
assert EventQueue.isDispatchThread();
GemManager gemManager = getGemManager();
assert gemManager != null : "gemManager must not be null";
assert !gemManager.needsRemoteReload() : "remote gems are ready";
LOGGER.finer("Updating local gems UI for: " + gemManager);
hideRemoteProgressBars();
List<Gem> remoteGems = gemManager.getRemoteGems();
updateList(NEW, remoteGems);
refreshGemsToUpdate();
}
/**
* Refresh Gems to update only when both local and remote gems are
* available. If not it is no-op.
*/
private void refreshGemsToUpdate() {
assert EventQueue.isDispatchThread();
List<Gem> localGems = getGemManager().getLocalGems();
if (localGems.isEmpty()) {
return;
}
List<Gem> remoteGems = getGemManager().getRemoteGems();
if (remoteGems.isEmpty()) {
return;
}
Map<String, Gem> localsNameToGem = new HashMap<String, Gem>();
for (Gem gem : localGems) {
localsNameToGem.put(gem.getName(), gem);
}
Set<String> localNames = localsNameToGem.keySet();
List<Gem> gemsNeedingUpdated = new ArrayList<Gem>();
for (Gem gem : remoteGems) {
if (localNames.contains(gem.getName())) {
String latestAvailable = gem.getLatestAvailable();
Gem localGem = localsNameToGem.get(gem.getName());
String latestInstalled = localGem.getLatestInstalled();
if (Util.compareVersions(latestAvailable, latestInstalled) > 0) {
Gem update = new Gem(gem.getName(),
localGem.getInstalledVersionsAsString(),
latestAvailable);
update.setDescription(localGem.getDescription());
gemsNeedingUpdated.add(update);
}
}
}
updateList(UPDATED, gemsNeedingUpdated);
}
private void hideProgressBars() {
hideLocalProgressBars();
hideRemoteProgressBars();
}
private void hideRemoteProgressBars() {
updatedProgress.setVisible(false);
updatedProgressLabel.setVisible(false);
newProgress.setVisible(false);
newProgressLabel.setVisible(false);
}
private void hideLocalProgressBars() {
installedProgress.setVisible(false);
installedProgressLabel.setVisible(false);
}
private void updateList(final TabIndex tab, final List<Gem> gems) {
assert EventQueue.isDispatchThread();
JList list;
switch (tab) {
case NEW:
list = newList;
break;
case UPDATED:
list = updatedList;
break;
case INSTALLED:
list = installedList;
break;
default:
throw new IllegalArgumentException("Unknonw tab: " + tab); // NOI18N
}
if (gems == null) {
// attempting to filter before the list has been fetched - ignore
return;
}
GemListModel model = new GemListModel(gems, getFilter());
list.clearSelection();
list.setModel(model);
list.invalidate();
list.repaint();
setTabTitle(tab, model);
setEnabled(tab, true);
}
private void setTabTitle(final TabIndex tab, final GemListModel model) {
int allSize = model.getAllSize();
int nOfGems = model.getSize();
String count;
if (nOfGems < allSize) {
count = nOfGems + "/" + allSize; // NOI18N
} else {
count = Integer.toString(allSize);
}
String tabTitle = tab.getTitle() + '(' + count + ')';
gemsTab.setTitleAt(tab.getPosition(), tabTitle);
}
/** Return whether any gems were modified - roots should be recomputed after panel is taken down */
public boolean isModified() {
return gemsModified;
}
private static void showProgressBar(JList list, JTextPane description, JProgressBar progress, JLabel progressLabel) {
assert EventQueue.isDispatchThread();
if (list.getSelectedIndex() != -1) {
updateGemDescription(description, null);
}
progress.setVisible(true);
progressLabel.setVisible(true);
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
gemsTab = new javax.swing.JTabbedPane();
updatedPanel = new javax.swing.JPanel();
searchUpdatedText = new javax.swing.JTextField();
searchUpdatedLbl = new javax.swing.JLabel();
reloadUpdatedButton = new javax.swing.JButton();
updatedSP = new javax.swing.JScrollPane();
updatedList = new javax.swing.JList();
updateButton = new javax.swing.JButton();
updateAllButton = new javax.swing.JButton();
jScrollPane6 = new javax.swing.JScrollPane();
updatedDesc = new javax.swing.JTextPane();
updatedProgress = new javax.swing.JProgressBar();
updatedProgressLabel = new javax.swing.JLabel();
installedPanel = new javax.swing.JPanel();
searchInstText = new javax.swing.JTextField();
searchInstLbl = new javax.swing.JLabel();
reloadInstalledButton = new javax.swing.JButton();
uninstallButton = new javax.swing.JButton();
installedSP = new javax.swing.JScrollPane();
installedList = new javax.swing.JList();
jScrollPane5 = new javax.swing.JScrollPane();
installedDesc = new javax.swing.JTextPane();
installedProgress = new javax.swing.JProgressBar();
installedProgressLabel = new javax.swing.JLabel();
newPanel = new javax.swing.JPanel();
searchNewText = new javax.swing.JTextField();
searchNewLbl = new javax.swing.JLabel();
reloadNewButton = new javax.swing.JButton();
installButton = new javax.swing.JButton();
newSP = new javax.swing.JScrollPane();
newList = new javax.swing.JList();
jScrollPane4 = new javax.swing.JScrollPane();
newDesc = new javax.swing.JTextPane();
newProgress = new javax.swing.JProgressBar();
newProgressLabel = new javax.swing.JLabel();
installLocalButton = new javax.swing.JButton();
settingsPanel = new javax.swing.JPanel();
proxyButton = new javax.swing.JButton();
allVersionsCheckbox = new javax.swing.JCheckBox();
descriptionCheckbox = new javax.swing.JCheckBox();
verboseCheckBox = new javax.swing.JCheckBox();
rubyPlatformLabel = new javax.swing.JLabel();
platforms = org.netbeans.modules.ruby.platform.PlatformComponentFactory.getRubyPlatformsComboxBox();
manageButton = new javax.swing.JButton();
gemHome = new javax.swing.JLabel();
gemHomeValue = new javax.swing.JTextField();
browseGemHome = new javax.swing.JButton();
oldRubyGemsText = new javax.swing.JLabel();
FormListener formListener = new FormListener();
searchUpdatedText.setColumns(14);
searchUpdatedText.addActionListener(formListener);
searchUpdatedLbl.setLabelFor(searchUpdatedText);
org.openide.awt.Mnemonics.setLocalizedText(searchUpdatedLbl, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchUpdatedLbl.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(reloadUpdatedButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadUpdatedButton.text")); // NOI18N
reloadUpdatedButton.addActionListener(formListener);
updatedSP.setViewportView(updatedList);
updatedList.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedList.AccessibleContext.accessibleName")); // NOI18N
updatedList.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedList.AccessibleContext.accessibleDescription")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(updateButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updateButton.text")); // NOI18N
updateButton.setEnabled(false);
updateButton.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(updateAllButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updateAllButton.text")); // NOI18N
updateAllButton.addActionListener(formListener);
updatedDesc.setEditable(false);
jScrollPane6.setViewportView(updatedDesc);
updatedDesc.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedDesc.AccessibleContext.accessibleName")); // NOI18N
updatedDesc.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedDesc.AccessibleContext.accessibleDescription")); // NOI18N
updatedProgress.setIndeterminate(true);
org.openide.awt.Mnemonics.setLocalizedText(updatedProgressLabel, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedProgressLabel.text")); // NOI18N
org.jdesktop.layout.GroupLayout updatedPanelLayout = new org.jdesktop.layout.GroupLayout(updatedPanel);
updatedPanel.setLayout(updatedPanelLayout);
updatedPanelLayout.setHorizontalGroup(
updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(updatedPanelLayout.createSequentialGroup()
.addContainerGap()
.add(updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, updatedPanelLayout.createSequentialGroup()
.add(reloadUpdatedButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 442, Short.MAX_VALUE)
.add(searchUpdatedLbl)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(searchUpdatedText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 156, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(updatedPanelLayout.createSequentialGroup()
.add(updateButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(updateAllButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 366, Short.MAX_VALUE)
.add(updatedProgressLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(updatedProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.TRAILING, updatedPanelLayout.createSequentialGroup()
.add(updatedSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 489, Short.MAX_VALUE)
.add(18, 18, 18)
.add(jScrollPane6, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 283, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
updatedPanelLayout.setVerticalGroup(
updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(updatedPanelLayout.createSequentialGroup()
.addContainerGap()
.add(updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(searchUpdatedLbl)
.add(searchUpdatedText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(reloadUpdatedButton))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(jScrollPane6, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE)
.add(updatedSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(updatedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(updateButton)
.add(updateAllButton))
.add(updatedProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(updatedProgressLabel))
.addContainerGap())
);
searchUpdatedText.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchUpdatedText.AccessibleContext.accessibleDescription")); // NOI18N
searchUpdatedLbl.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchUpdatedLbl.AccessibleContext.accessibleDescription")); // NOI18N
reloadUpdatedButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadReposButton.AccessibleContext.accessibleDescription")); // NOI18N
updatedSP.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane3.AccessibleContext.accessibleDescription")); // NOI18N
updateButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updateButton.AccessibleContext.accessibleDescription")); // NOI18N
updateAllButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updateAllButton.AccessibleContext.accessibleDescription")); // NOI18N
jScrollPane6.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane6.AccessibleContext.accessibleDescription")); // NOI18N
updatedProgress.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedProgress.AccessibleContext.accessibleDescription")); // NOI18N
updatedProgressLabel.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedProgressLabel.AccessibleContext.accessibleDescription")); // NOI18N
gemsTab.addTab(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.updatedPanel.TabConstraints.tabTitle"), updatedPanel); // NOI18N
searchInstText.setColumns(14);
searchInstText.addActionListener(formListener);
searchInstLbl.setLabelFor(searchInstText);
org.openide.awt.Mnemonics.setLocalizedText(searchInstLbl, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchInstLbl.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(reloadInstalledButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadInstalledButton.text")); // NOI18N
reloadInstalledButton.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(uninstallButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.uninstallButton.text")); // NOI18N
uninstallButton.setEnabled(false);
uninstallButton.addActionListener(formListener);
installedSP.setViewportView(installedList);
installedList.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedList.AccessibleContext.accessibleName")); // NOI18N
installedList.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedList.AccessibleContext.accessibleDescription")); // NOI18N
installedDesc.setEditable(false);
jScrollPane5.setViewportView(installedDesc);
installedDesc.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedDesc.AccessibleContext.accessibleName")); // NOI18N
installedDesc.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedDesc.AccessibleContext.accessibleDescription")); // NOI18N
installedProgress.setIndeterminate(true);
org.openide.awt.Mnemonics.setLocalizedText(installedProgressLabel, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedProgressLabel.text")); // NOI18N
org.jdesktop.layout.GroupLayout installedPanelLayout = new org.jdesktop.layout.GroupLayout(installedPanel);
installedPanel.setLayout(installedPanelLayout);
installedPanelLayout.setHorizontalGroup(
installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(installedPanelLayout.createSequentialGroup()
.addContainerGap()
.add(installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, installedPanelLayout.createSequentialGroup()
.add(reloadInstalledButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 442, Short.MAX_VALUE)
.add(searchInstLbl)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(searchInstText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 156, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(installedPanelLayout.createSequentialGroup()
.add(uninstallButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 468, Short.MAX_VALUE)
.add(installedProgressLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(installedProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.TRAILING, installedPanelLayout.createSequentialGroup()
.add(installedSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 489, Short.MAX_VALUE)
.add(18, 18, 18)
.add(jScrollPane5, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 283, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
installedPanelLayout.setVerticalGroup(
installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(installedPanelLayout.createSequentialGroup()
.addContainerGap()
.add(installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(searchInstLbl)
.add(reloadInstalledButton)
.add(searchInstText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(installedSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE)
.add(jScrollPane5, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(installedPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(uninstallButton)
.add(installedProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(installedProgressLabel))
.addContainerGap())
);
searchInstText.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.instSearchText.AccessibleContext.accessibleDescription")); // NOI18N
searchInstLbl.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.instSearchLbl.AccessibleContext.accessibleDescription")); // NOI18N
reloadInstalledButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadInstalledButton.AccessibleContext.accessibleDescription")); // NOI18N
uninstallButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.uninstallButton.AccessibleContext.accessibleDescription")); // NOI18N
installedSP.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane1.AccessibleContext.accessibleDescription")); // NOI18N
jScrollPane5.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane5.AccessibleContext.accessibleDescription")); // NOI18N
installedProgress.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedProgress.AccessibleContext.accessibleDescription")); // NOI18N
installedProgressLabel.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedProgressLabel.AccessibleContext.accessibleDescription")); // NOI18N
gemsTab.addTab(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installedPanel.TabConstraints.tabTitle"), installedPanel); // NOI18N
searchNewText.setColumns(14);
searchNewText.addActionListener(formListener);
searchNewLbl.setLabelFor(searchNewText);
org.openide.awt.Mnemonics.setLocalizedText(searchNewLbl, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchNewLbl.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(reloadNewButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadNewButton.text")); // NOI18N
reloadNewButton.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(installButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installButton.text")); // NOI18N
installButton.setEnabled(false);
installButton.addActionListener(formListener);
newSP.setViewportView(newList);
newList.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newList.AccessibleContext.accessibleName")); // NOI18N
newList.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newList.AccessibleContext.accessibleDescription")); // NOI18N
newDesc.setEditable(false);
jScrollPane4.setViewportView(newDesc);
newDesc.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newDesc.AccessibleContext.accessibleName")); // NOI18N
newDesc.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newDesc.AccessibleContext.accessibleDescription")); // NOI18N
newProgress.setIndeterminate(true);
org.openide.awt.Mnemonics.setLocalizedText(newProgressLabel, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newProgressLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(installLocalButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installLocalButton.text")); // NOI18N
installLocalButton.addActionListener(formListener);
org.jdesktop.layout.GroupLayout newPanelLayout = new org.jdesktop.layout.GroupLayout(newPanel);
newPanel.setLayout(newPanelLayout);
newPanelLayout.setHorizontalGroup(
newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(newPanelLayout.createSequentialGroup()
.addContainerGap()
.add(newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, newPanelLayout.createSequentialGroup()
.add(reloadNewButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 442, Short.MAX_VALUE)
.add(searchNewLbl)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(searchNewText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 156, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(newPanelLayout.createSequentialGroup()
.add(installButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(installLocalButton)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 347, Short.MAX_VALUE)
.add(newProgressLabel)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(newProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.add(org.jdesktop.layout.GroupLayout.TRAILING, newPanelLayout.createSequentialGroup()
.add(newSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 489, Short.MAX_VALUE)
.add(18, 18, 18)
.add(jScrollPane4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 283, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.addContainerGap())
);
newPanelLayout.setVerticalGroup(
newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(newPanelLayout.createSequentialGroup()
.addContainerGap()
.add(newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(searchNewLbl)
.add(reloadNewButton)
.add(searchNewText, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(newSP, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE)
.add(jScrollPane4, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 262, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(newPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(installButton)
.add(installLocalButton))
.add(newProgress, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
.add(newProgressLabel))
.addContainerGap())
);
searchNewText.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchNewText.AccessibleContext.accessibleDescription")); // NOI18N
searchNewLbl.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.searchNewLbl.AccessibleContext.accessibleDescription")); // NOI18N
reloadNewButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.reloadNewButton.AccessibleContext.accessibleDescription")); // NOI18N
installButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.installButton.AccessibleContext.accessibleDescription")); // NOI18N
newSP.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane2.AccessibleContext.accessibleDescription")); // NOI18N
jScrollPane4.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.jScrollPane4.AccessibleContext.accessibleDescription")); // NOI18N
newProgress.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newProgress.AccessibleContext.accessibleDescription")); // NOI18N
newProgressLabel.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newProgressLabel.AccessibleContext.accessibleDescription")); // NOI18N
gemsTab.addTab(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.newPanel.TabConstraints.tabTitle"), newPanel); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(proxyButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.proxyButton.text")); // NOI18N
proxyButton.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(allVersionsCheckbox, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.allVersionsCheckbox.text")); // NOI18N
allVersionsCheckbox.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(descriptionCheckbox, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.descriptionCheckbox.text")); // NOI18N
descriptionCheckbox.addActionListener(formListener);
org.openide.awt.Mnemonics.setLocalizedText(verboseCheckBox, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.verboseCheckBox.text")); // NOI18N
verboseCheckBox.addItemListener(formListener);
org.jdesktop.layout.GroupLayout settingsPanelLayout = new org.jdesktop.layout.GroupLayout(settingsPanel);
settingsPanel.setLayout(settingsPanelLayout);
settingsPanelLayout.setHorizontalGroup(
settingsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(settingsPanelLayout.createSequentialGroup()
.addContainerGap()
.add(settingsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(verboseCheckBox)
.add(descriptionCheckbox)
.add(proxyButton)
.add(allVersionsCheckbox))
.addContainerGap(458, Short.MAX_VALUE))
);
settingsPanelLayout.setVerticalGroup(
settingsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(settingsPanelLayout.createSequentialGroup()
.addContainerGap()
.add(proxyButton)
.add(18, 18, 18)
.add(allVersionsCheckbox)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(descriptionCheckbox)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(verboseCheckBox)
.addContainerGap(216, Short.MAX_VALUE))
);
proxyButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.proxyButton.AccessibleContext.accessibleDescription")); // NOI18N
allVersionsCheckbox.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.allVersionsCheckbox.AccessibleContext.accessibleDescription")); // NOI18N
descriptionCheckbox.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.descriptionCheckbox.AccessibleContext.accessibleDescription")); // NOI18N
verboseCheckBox.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.verboseCheckBox.AccessibleContext.accessibleDescription")); // NOI18N
gemsTab.addTab(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.settingsPanel.TabConstraints.tabTitle"), settingsPanel); // NOI18N
rubyPlatformLabel.setLabelFor(platforms);
org.openide.awt.Mnemonics.setLocalizedText(rubyPlatformLabel, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.rubyPlatformLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(manageButton, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.manageButton.text")); // NOI18N
manageButton.addActionListener(formListener);
gemHome.setLabelFor(gemHomeValue);
org.openide.awt.Mnemonics.setLocalizedText(gemHome, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.gemHome.text")); // NOI18N
gemHomeValue.setEditable(false);
org.openide.awt.Mnemonics.setLocalizedText(browseGemHome, org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.browseGemHome.text")); // NOI18N
browseGemHome.addActionListener(formListener);
org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
.add(org.jdesktop.layout.GroupLayout.LEADING, gemsTab, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 819, Short.MAX_VALUE)
.add(layout.createSequentialGroup()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
.add(gemHome, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.add(rubyPlatformLabel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, gemHomeValue, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 591, Short.MAX_VALUE)
.add(org.jdesktop.layout.GroupLayout.TRAILING, platforms, 0, 591, Short.MAX_VALUE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(org.jdesktop.layout.GroupLayout.TRAILING, manageButton)
.add(org.jdesktop.layout.GroupLayout.TRAILING, browseGemHome, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 80, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)))
.add(org.jdesktop.layout.GroupLayout.LEADING, oldRubyGemsText, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 819, Short.MAX_VALUE))
.addContainerGap())
);
layout.linkSize(new java.awt.Component[] {browseGemHome, manageButton}, org.jdesktop.layout.GroupLayout.HORIZONTAL);
layout.linkSize(new java.awt.Component[] {gemHome, rubyPlatformLabel}, org.jdesktop.layout.GroupLayout.HORIZONTAL);
layout.setVerticalGroup(
layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
.add(layout.createSequentialGroup()
.addContainerGap()
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(rubyPlatformLabel)
.add(manageButton)
.add(platforms, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
.add(gemHome)
.add(browseGemHome)
.add(gemHomeValue, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
.add(gemsTab, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 375, Short.MAX_VALUE)
.addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
.add(oldRubyGemsText)
.addContainerGap())
);
gemsTab.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.gemsTab.AccessibleContext.accessibleName")); // NOI18N
gemsTab.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.gemsTab.AccessibleContext.accessibleDescription")); // NOI18N
platforms.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.platforms.AccessibleContext.accessibleName")); // NOI18N
platforms.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.platforms.AccessibleContext.accessibleDescription")); // NOI18N
manageButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.manageButton.AccessibleContext.accessibleDescription")); // NOI18N
gemHomeValue.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.gemHomeValue.AccessibleContext.accessibleName")); // NOI18N
gemHomeValue.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.gemHomeValue.AccessibleContext.accessibleDescription")); // NOI18N
browseGemHome.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.browseGemHome.AccessibleContext.accessibleDescription")); // NOI18N
getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.AccessibleContext.accessibleName")); // NOI18N
getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(GemPanel.class, "GemPanel.AccessibleContext.accessibleDescription")); // NOI18N
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener, java.awt.event.ItemListener {
FormListener() {}
public void actionPerformed(java.awt.event.ActionEvent evt) {
if (evt.getSource() == searchUpdatedText) {
GemPanel.this.searchUpdatedTextActionPerformed(evt);
}
else if (evt.getSource() == reloadUpdatedButton) {
GemPanel.this.reloadUpdatedButtonActionPerformed(evt);
}
else if (evt.getSource() == updateButton) {
GemPanel.this.updateButtonActionPerformed(evt);
}
else if (evt.getSource() == updateAllButton) {
GemPanel.this.updateAllButtonActionPerformed(evt);
}
else if (evt.getSource() == searchInstText) {
GemPanel.this.searchInstTextActionPerformed(evt);
}
else if (evt.getSource() == reloadInstalledButton) {
GemPanel.this.reloadInstalledButtonActionPerformed(evt);
}
else if (evt.getSource() == uninstallButton) {
GemPanel.this.uninstallButtonActionPerformed(evt);
}
else if (evt.getSource() == searchNewText) {
GemPanel.this.searchNewTextActionPerformed(evt);
}
else if (evt.getSource() == reloadNewButton) {
GemPanel.this.reloadNewButtonActionPerformed(evt);
}
else if (evt.getSource() == installButton) {
GemPanel.this.installButtonActionPerformed(evt);
}
else if (evt.getSource() == installLocalButton) {
GemPanel.this.installLocalButtonActionPerformed(evt);
}
else if (evt.getSource() == proxyButton) {
GemPanel.this.proxyButtonActionPerformed(evt);
}
else if (evt.getSource() == allVersionsCheckbox) {
GemPanel.this.allVersionsCheckboxActionPerformed(evt);
}
else if (evt.getSource() == descriptionCheckbox) {
GemPanel.this.descriptionCheckboxActionPerformed(evt);
}
else if (evt.getSource() == manageButton) {
GemPanel.this.manageButtonActionPerformed(evt);
}
else if (evt.getSource() == browseGemHome) {
GemPanel.this.browseGemHomeActionPerformed(evt);
}
}
public void itemStateChanged(java.awt.event.ItemEvent evt) {
if (evt.getSource() == verboseCheckBox) {
GemPanel.this.verboseCheckBoxItemStateChanged(evt);
}
}
}// </editor-fold>//GEN-END:initComponents
private void reloadNewButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadNewButtonActionPerformed
getGemManager().resetRemote();
refreshRemoteGems();
}//GEN-LAST:event_reloadNewButtonActionPerformed
private void proxyButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_proxyButtonActionPerformed
OptionsDisplayer.getDefault().open("General"); // NOI18N
}//GEN-LAST:event_proxyButtonActionPerformed
private void applyFilter() {
assert EventQueue.isDispatchThread();
removeFilterDocumentListeners();
applyFilter(NEW, searchNewText, newList, newDesc, installButton);
applyFilter(UPDATED, searchUpdatedText, updatedList, updatedDesc, updateButton);
applyFilter(INSTALLED, searchInstText, installedList, installedDesc, uninstallButton);
addFilterDocumentListeners();
}
private void applyFilter(final TabIndex tab,
final JTextField searchField, final JList list,
final JTextPane desc, final JButton button) {
// keep search filter fields in sync
int pos = searchField.getCaretPosition();
String _filter = getFilter();
searchField.setText(_filter);
searchField.setCaretPosition(pos > _filter.length() ? _filter.length() : pos);
GemListModel gemModel = (GemListModel) list.getModel();
gemModel.applyFilter(getFilter());
setTabTitle(tab, gemModel);
if (list.getSelectedValue() == null) {
list.setSelectedIndex(0);
}
updateGemDescription(list, desc, button);
}
private void reloadUpdatedButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadUpdatedButtonActionPerformed
getGemManager().reset();
refreshAllGems();
}//GEN-LAST:event_reloadUpdatedButtonActionPerformed
private void installButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_installButtonActionPerformed
assert EventQueue.isDispatchThread();
int[] indices = newList.getSelectedIndices();
List<Gem> gems = new ArrayList<Gem>();
for (int index : indices) {
Object o = newList.getModel().getElementAt(index);
if (o instanceof Gem) { // Could be error or please wait string
Gem gem = (Gem)o;
gems.add(gem);
}
}
if (!gems.isEmpty()) {
for (Gem chosen : gems) {
// Get some information about the chosen gem
InstallationSettingsPanel panel = new InstallationSettingsPanel(chosen);
panel.getAccessibleContext().setAccessibleDescription(
getMessage("InstallationSettingsPanel.AccessibleContext.accessibleDescription"));
DialogDescriptor dd = new DialogDescriptor(panel, getMessage("ChooseGemSettings"));
dd.setOptionType(NotifyDescriptor.OK_CANCEL_OPTION);
dd.setModal(true);
dd.setHelpCtx(new HelpCtx(GemPanel.class));
Object result = DialogDisplayer.getDefault().notify(dd);
if (result.equals(NotifyDescriptor.OK_OPTION)) {
Gem gem = new Gem(panel.getGemName(), null, null);
GemListRefresher completionTask = new GemListRefresher();
getGemManager().install(new Gem[] { gem }, this, false, false, panel.getVersion(),
panel.getIncludeDepencies(), true, completionTask);
}
}
}
}//GEN-LAST:event_installButtonActionPerformed
private void updateAllButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateAllButtonActionPerformed
Runnable completionTask = new GemListRefresher();
getGemManager().update(null, this, false, false, false, true, completionTask);
}//GEN-LAST:event_updateAllButtonActionPerformed
private void updateButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateButtonActionPerformed
assert EventQueue.isDispatchThread();
int[] indices = updatedList.getSelectedIndices();
List<Gem> gems = new ArrayList<Gem>();
if (indices != null) {
for (int index : indices) {
assert index >= 0;
Object o = updatedList.getModel().getElementAt(index);
if (o instanceof Gem) { // Could be error or please wait string
Gem gem = (Gem)o;
gems.add(gem);
}
}
}
if (!gems.isEmpty()) {
Runnable completionTask = new GemListRefresher();
getGemManager().update(gems.toArray(new Gem[gems.size()]), this, false, false, false, true, completionTask);
}
}//GEN-LAST:event_updateButtonActionPerformed
private void uninstallButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uninstallButtonActionPerformed
assert EventQueue.isDispatchThread();
int[] indices = installedList.getSelectedIndices();
List<Gem> gems = new ArrayList<Gem>();
if (indices != null) {
for (int index : indices) {
assert index >= 0;
Object o = installedList.getModel().getElementAt(index);
if (o instanceof Gem) { // Could be error or please wait string
Gem gem = (Gem)o;
gems.add(gem);
}
}
}
if (!gems.isEmpty()) {
for (Gem chosen : gems) {
// Get some information about the chosen gem
UninstallationSettingsPanel panel = new UninstallationSettingsPanel(chosen);
panel.getAccessibleContext().setAccessibleDescription(
getMessage("InstallationSettingsPanel.AccessibleContext.accessibleDescription"));
DialogDescriptor dd = new DialogDescriptor(panel, getMessage("GemUninstallationSettings"));
dd.setOptionType(NotifyDescriptor.OK_CANCEL_OPTION);
dd.setModal(true);
dd.setHelpCtx(new HelpCtx(GemPanel.class));
Object result = DialogDisplayer.getDefault().notify(dd);
if (result.equals(NotifyDescriptor.OK_OPTION)) {
GemInstallInfo gem = new GemInstallInfo(panel.getGemName(), panel.getVersion(), panel.getIgnoreDepencies());
GemListRefresher completionTask = new GemListRefresher();
getGemManager().uninstall(Collections.singletonList(gem), this, true, completionTask);
}
}
}//GEN-LAST:event_uninstallButtonActionPerformed
}
private void reloadInstalledButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadInstalledButtonActionPerformed
getGemManager().resetLocal();
refreshLocalGems();
}//GEN-LAST:event_reloadInstalledButtonActionPerformed
private void manageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_manageButtonActionPerformed
RubyPlatformCustomizer.manage(platforms, false);
}//GEN-LAST:event_manageButtonActionPerformed
private void browseGemHomeActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseGemHomeActionPerformed
boolean changed = chooseAndSetGemHome(this, getSelectedPlatform());
if (changed) {
platformChanged();
}
}//GEN-LAST:event_browseGemHomeActionPerformed
private void installLocalButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_installLocalButtonActionPerformed
JFileChooser chooser = new JFileChooser(RubyPreferences.getPreferences().get(LAST_GEM_DIRECTORY, ""));
chooser.setAcceptAllFileFilterUsed(false);
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setFileFilter(new FileFilter() {
public boolean accept(File f) {
return f.isDirectory() || (f.isFile() && f.getName().toLowerCase(Locale.US).endsWith(".gem")); // NOI18N
}
public String getDescription() {
return getMessage("GemPanel.rubygems.files.filter");
}
});
int ret = chooser.showOpenDialog(this);
if (ret == JFileChooser.APPROVE_OPTION) {
File gem = FileUtil.normalizeFile(chooser.getSelectedFile());
RubyPreferences.getPreferences().put(LAST_GEM_DIRECTORY, gem.getParentFile().getAbsolutePath());
GemListRefresher completionTask = new GemListRefresher();
getGemManager().installLocal(gem, this, false, false, true, completionTask);
}
}//GEN-LAST:event_installLocalButtonActionPerformed
private void allVersionsCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_allVersionsCheckboxActionPerformed
RubyPreferences.setFetchAllVersions(allVersionsCheckbox.isSelected());
}//GEN-LAST:event_allVersionsCheckboxActionPerformed
private void descriptionCheckboxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_descriptionCheckboxActionPerformed
RubyPreferences.setFetchGemDescriptions(descriptionCheckbox.isSelected());
}//GEN-LAST:event_descriptionCheckboxActionPerformed
private void searchUpdatedTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchUpdatedTextActionPerformed
// Eat Enter, so the dialog is not closed when user hits the Enter in
// search field. Filter task is already submitted and will be applied in
// few ms.
}//GEN-LAST:event_searchUpdatedTextActionPerformed
private void searchInstTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchInstTextActionPerformed
// see comment in #searchUpdatedTextActionPerformed
}//GEN-LAST:event_searchInstTextActionPerformed
private void searchNewTextActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchNewTextActionPerformed
// see comment in #searchUpdatedTextActionPerformed
}//GEN-LAST:event_searchNewTextActionPerformed
private void verboseCheckBoxItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_verboseCheckBoxItemStateChanged
RubyPreferences.setGemVerboseOutput(verboseCheckBox.isSelected());
}//GEN-LAST:event_verboseCheckBoxItemStateChanged
public static File chooseGemRepository(final Component parent) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int ret = chooser.showOpenDialog(parent);
if (ret == JFileChooser.APPROVE_OPTION) {
File gemHomeF = FileUtil.normalizeFile(chooser.getSelectedFile());
if (GemManager.isValidGemHome(gemHomeF)) {
return gemHomeF;
}
if (!gemHomeF.exists() || (gemHomeF.isDirectory() && gemHomeF.list().length == 0)) {
if (Util.confirmLocalized(GemPanel.class, "GemPanel.empty.create.gemrepo", gemHomeF.getAbsolutePath())) { // NOI18N
try {
GemManager.initializeRepository(gemHomeF);
return gemHomeF;
} catch (IOException ioe) {
LOGGER.log(Level.SEVERE, ioe.getLocalizedMessage(), ioe);
}
}
} else {
Util.notifyLocalizedInfo(GemPanel.class, "GemPanel.invalid.gemHome", gemHomeF.getAbsolutePath()); // NOI18N
}
}
return null;
}
public static boolean chooseAndSetGemHome(final Component parent, final RubyPlatform platform) {
if (platform == null) {
return false;
}
assert platform.hasRubyGemsInstalled() : "has RubyGems installed";
File gemHomeF = chooseGemRepository(parent);
if (gemHomeF != null) {
platform.setGemHome(gemHomeF);
return true;
}
return false;
}
private void showGemErrors(final List<String> errors) {
assert EventQueue.isDispatchThread();
getGemManager().reset();
StringBuilder sb = new StringBuilder();
for (String error : errors) {
sb.append(error).append('\n');
}
Util.notifyLocalized(GemPanel.class, "GemPanel.GemsFetchingFailed", // NOI18N
NotifyDescriptor.ERROR_MESSAGE, sb.toString());
}
private void refreshAllGems() {
assert EventQueue.isDispatchThread();
refreshLocalGems();
refreshRemoteGems();
}
private void refreshLocalGems() {
assert EventQueue.isDispatchThread();
setEnabledLocalsGUI(false);
showProgressBar(installedList, installedDesc, installedProgress, installedProgressLabel);
installedList.setModel(emptyGemListModel);
gemsTab.setTitleAt(INSTALLED.getPosition(), INSTALLED.getTitle() + "(-)"); // NOI18N
final GemManager gemManager = getGemManager();
Runnable updateTask = new Runnable() {
public void run() {
LOGGER.finer("Update of local gems for " + gemManager + " scheduled");
assert !EventQueue.isDispatchThread();
final List<String> errors = gemManager.reloadLocalIfNeeded();
// Update UI
EventQueue.invokeLater(new Runnable() {
public void run() {
LOGGER.finer("Update of local gems for " + gemManager + " finished");
if (closed) {
return;
}
boolean platformHasChanged = !gemManager.equals(getGemManager());
if (!errors.isEmpty()) {
showGemErrors(errors);
if (!platformHasChanged) {
hideLocalProgressBars();
// enable Reload buttons in error state, so user
// might trigger reload after attempt to fix the
// problem
enableLocalReloadGUI();
}
return;
}
if (!platformHasChanged) {
notifyLocalGemsUpdated();
} else { // platform has changed, ignore UI update
LOGGER.finer("Gem Manager has changed from " + gemManager
+ " to " + getGemManager() + ". Ignoring local gems update."); // NOI18N
}
}
});
}
};
LOGGER.finer("Submitting refreshing of gems for: " + gemManager);
updateTasksQueue.post(updateTask);
}
private void refreshRemoteGems() {
assert EventQueue.isDispatchThread();
setEnabledRemoteGUI(false);
showProgressBar(newList, newDesc, newProgress, newProgressLabel);
showProgressBar(updatedList, updatedDesc, updatedProgress, updatedProgressLabel);
newList.setModel(emptyGemListModel);
updatedList.setModel(emptyGemListModel);
gemsTab.setTitleAt(NEW.getPosition(), NEW.getTitle() + "(-)"); // NOI18N
gemsTab.setTitleAt(UPDATED.getPosition(), UPDATED.getTitle() + "(-)"); // NOI18N
final GemManager gemManager = getGemManager();
Runnable updateTask = new Runnable() {
public void run() {
LOGGER.finer("Update of remote gems for " + gemManager + " scheduled");
assert !EventQueue.isDispatchThread();
final List<String> errors = gemManager.reloadRemoteIfNeeded();
// Update UI
EventQueue.invokeLater(new Runnable() {
public void run() {
LOGGER.finer("Update of remote gems for " + gemManager + " finished");
if (closed) {
return;
}
boolean platformHasChanged = !gemManager.equals(getGemManager());
if (!errors.isEmpty()) {
showGemErrors(errors);
if (!platformHasChanged) {
hideRemoteProgressBars();
// enable Reload buttons in error state, so user
// might trigger reload after attempt to fix the
// problem
enableRemoteReloadGUI();
}
return;
}
if (!platformHasChanged) {
notifyRemoteGemsUpdated();
} else { // platform has changed, ignore UI update
LOGGER.finer("Gem Manager has changed from " + gemManager
+ " to " + getGemManager() + ". Ignoring remote gems update."); // NOI18N
}
}
});
}
};
LOGGER.finer("Submitting refreshing of gems for: " + gemManager);
updateTasksQueue.post(updateTask);
}
private RubyPlatform getSelectedPlatform() {
if (!EventQueue.isDispatchThread()) {
Exceptions.printStackTrace(new AssertionError("getSelectedPlatform() must be called from EDT"));
}
return PlatformComponentFactory.getPlatform(platforms);
}
private GemManager getGemManager() {
if (!EventQueue.isDispatchThread()) {
Exceptions.printStackTrace(new AssertionError("getGemManager() must be called from EDT"));
}
RubyPlatform platform = getSelectedPlatform();
return platform == null ? null : platform.getGemManager();
}
private static class MyListSelectionListener implements ListSelectionListener {
private final JButton button;
private final JTextPane pane;
private final JList list;
private MyListSelectionListener(JList list, JTextPane pane, JButton button) {
this.list = list;
this.pane = pane;
this.button = button;
}
public void valueChanged(ListSelectionEvent ev) {
if (ev.getValueIsAdjusting()) {
return;
}
updateGemDescription(list, pane, button);
}
}
private class GemListRefresher implements Runnable {
public void run() {
gemsModified = true;
if (!EventQueue.isDispatchThread()) {
EventQueue.invokeLater(this);
} else {
refreshAllGems();
}
}
}
private static String getMessage(final String key, final Object... params) {
return NbBundle.getMessage(GemPanel.class, key, params);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox allVersionsCheckbox;
private javax.swing.JButton browseGemHome;
private javax.swing.JCheckBox descriptionCheckbox;
private javax.swing.JLabel gemHome;
private javax.swing.JTextField gemHomeValue;
private javax.swing.JTabbedPane gemsTab;
private javax.swing.JButton installButton;
private javax.swing.JButton installLocalButton;
private javax.swing.JTextPane installedDesc;
private javax.swing.JList installedList;
private javax.swing.JPanel installedPanel;
private javax.swing.JProgressBar installedProgress;
private javax.swing.JLabel installedProgressLabel;
private javax.swing.JScrollPane installedSP;
private javax.swing.JScrollPane jScrollPane4;
private javax.swing.JScrollPane jScrollPane5;
private javax.swing.JScrollPane jScrollPane6;
private javax.swing.JButton manageButton;
private javax.swing.JTextPane newDesc;
private javax.swing.JList newList;
private javax.swing.JPanel newPanel;
private javax.swing.JProgressBar newProgress;
private javax.swing.JLabel newProgressLabel;
private javax.swing.JScrollPane newSP;
private javax.swing.JLabel oldRubyGemsText;
private javax.swing.JComboBox platforms;
private javax.swing.JButton proxyButton;
private javax.swing.JButton reloadInstalledButton;
private javax.swing.JButton reloadNewButton;
private javax.swing.JButton reloadUpdatedButton;
private javax.swing.JLabel rubyPlatformLabel;
private javax.swing.JLabel searchInstLbl;
private javax.swing.JTextField searchInstText;
private javax.swing.JLabel searchNewLbl;
private javax.swing.JTextField searchNewText;
private javax.swing.JLabel searchUpdatedLbl;
private javax.swing.JTextField searchUpdatedText;
private javax.swing.JPanel settingsPanel;
private javax.swing.JButton uninstallButton;
private javax.swing.JButton updateAllButton;
private javax.swing.JButton updateButton;
private javax.swing.JTextPane updatedDesc;
private javax.swing.JList updatedList;
private javax.swing.JPanel updatedPanel;
private javax.swing.JProgressBar updatedProgress;
private javax.swing.JLabel updatedProgressLabel;
private javax.swing.JScrollPane updatedSP;
private javax.swing.JCheckBox verboseCheckBox;
// End of variables declaration//GEN-END:variables
private final class FilterFieldListener implements DocumentListener {
public void insertUpdate(DocumentEvent e) { changedUpdate(e); }
public void removeUpdate(DocumentEvent e) { changedUpdate(e); }
public void changedUpdate(DocumentEvent e) {
Document doc = e.getDocument();
String filter;
try {
filter = e.getDocument().getText(0, doc.getLength());
setFilter(filter);
filterTask.schedule(350);
} catch (BadLocationException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}