| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.netbeans.modules.autoupdate.ui; |
| |
| import org.netbeans.api.autoupdate.OperationContainer; |
| import org.netbeans.api.autoupdate.OperationSupport; |
| import org.netbeans.modules.autoupdate.ui.wizards.UninstallUnitWizard; |
| import org.netbeans.modules.autoupdate.ui.wizards.InstallUnitWizard; |
| import java.awt.Component; |
| import java.awt.Cursor; |
| import java.awt.Image; |
| import java.awt.Point; |
| import java.awt.Rectangle; |
| import java.awt.event.ActionEvent; |
| import java.awt.event.ComponentAdapter; |
| import java.awt.event.ComponentEvent; |
| import java.awt.event.FocusEvent; |
| import java.awt.event.FocusListener; |
| import java.awt.event.KeyEvent; |
| import java.awt.event.MouseAdapter; |
| import java.awt.event.MouseEvent; |
| import java.lang.reflect.InvocationTargetException; |
| import java.text.SimpleDateFormat; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Date; |
| import java.util.HashSet; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| import java.util.prefs.PreferenceChangeEvent; |
| import java.util.prefs.PreferenceChangeListener; |
| import java.util.prefs.Preferences; |
| import javax.swing.AbstractAction; |
| import javax.swing.AbstractButton; |
| import javax.swing.Action; |
| import javax.swing.Icon; |
| import javax.swing.JButton; |
| import javax.swing.JComponent; |
| import javax.swing.JLabel; |
| import javax.swing.JMenuItem; |
| import javax.swing.JPopupMenu; |
| import javax.swing.JScrollPane; |
| import javax.swing.JTable; |
| import javax.swing.KeyStroke; |
| import javax.swing.ListSelectionModel; |
| import javax.swing.SwingConstants; |
| import javax.swing.SwingUtilities; |
| import javax.swing.event.DocumentEvent; |
| import javax.swing.event.DocumentListener; |
| import javax.swing.event.ListSelectionEvent; |
| import javax.swing.event.ListSelectionListener; |
| import javax.swing.event.TableModelEvent; |
| import javax.swing.event.TableModelListener; |
| import javax.swing.table.DefaultTableCellRenderer; |
| import javax.swing.table.TableModel; |
| import org.netbeans.api.autoupdate.OperationContainer.OperationInfo; |
| import org.netbeans.api.autoupdate.UpdateManager; |
| import org.netbeans.api.autoupdate.UpdateUnit; |
| import org.netbeans.api.progress.ProgressHandle; |
| import org.netbeans.api.progress.ProgressHandleFactory; |
| import org.netbeans.modules.autoupdate.ui.wizards.OperationWizardModel.OperationType; |
| import org.openide.awt.Mnemonics; |
| import org.openide.util.Exceptions; |
| import org.openide.util.ImageUtilities; |
| import org.openide.util.NbBundle; |
| import org.openide.util.NbPreferences; |
| import org.openide.util.RequestProcessor; |
| import org.openide.util.RequestProcessor.Task; |
| import org.openide.util.TaskListener; |
| |
| /** |
| * |
| * @author Jiri Rechtacek, Radek Matous |
| */ |
| public final class UnitTab extends javax.swing.JPanel { |
| static final String PROP_LAST_CHECK = "lastCheckTime"; // NOI18N |
| private PreferenceChangeListener preferenceChangeListener; |
| private UnitTable table = null; |
| private UnitDetails details = null; |
| private UnitCategoryTableModel model = null; |
| private DocumentListener dlForSearch; |
| private FocusListener flForSearch; |
| private String filter = ""; |
| private PluginManagerUI manager = null; |
| private PopupActionSupport popupActionsSupport; |
| private ButtonActionSupport buttonsActionsSupport; |
| private TabAction reloadAction; |
| private RowTabAction moreAction; |
| private RowTabAction lessAction; |
| private RowTabAction removeLocallyDownloaded; |
| |
| private static Boolean isWaitingForExternal = false; |
| |
| private static final RequestProcessor SEARCH_PROCESSOR = new RequestProcessor ("search-processor"); |
| private final RequestProcessor.Task searchTask = SEARCH_PROCESSOR.create (new Runnable (){ |
| @Override |
| public void run () { |
| if (filter != null) { |
| int row = getSelectedRow(); |
| final Unit u = (row >= 0) ? getModel().getUnitAtRow(row) : null; |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Runnable runAftreWards = new Runnable (){ |
| @Override |
| public void run () { |
| if (u != null) { |
| int row = findRow(u.updateUnit.getCodeName()); |
| restoreSelectedRow(row); |
| } |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| refreshState (); |
| } |
| }; |
| model.setFilter (filter, runAftreWards); |
| } |
| } |
| }); |
| private static final RequestProcessor DOWNLOAD_SIZE_PROCESSOR = new RequestProcessor ("download-size-processor", 1, true); |
| private Task getDownloadSizeTask = null; |
| |
| /** Creates new form UnitTab */ |
| public UnitTab (UnitTable table, UnitDetails details, PluginManagerUI manager) { |
| this.table = table; |
| this.details = details; |
| this.manager = manager; |
| TableModel m = table.getModel (); |
| assert m instanceof UnitCategoryTableModel : m + " instanceof UnitCategoryTableModel."; |
| this.model = (UnitCategoryTableModel) m; |
| table.getSelectionModel ().setSelectionMode (ListSelectionModel.SINGLE_SELECTION); |
| initComponents (); |
| lWarning.setVisible(false);//#164953 |
| spTab.setLeftComponent (new JScrollPane (table)); |
| spTab.setRightComponent (new JScrollPane (details, |
| JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED)); |
| initTab (); |
| listenOnSelection (); |
| addComponentListener (new ComponentAdapter (){ |
| @Override |
| public void componentShown (ComponentEvent e) { |
| super.componentShown (e); |
| focusTable (); |
| |
| } |
| }); |
| addUpdateUnitListener(new UpdateUnitListener() { |
| @Override |
| public void updateUnitsChanged() { |
| UnitTab.this.manager.updateUnitsChanged(); |
| } |
| |
| @Override |
| public void buttonsChanged() { |
| UnitTab.this.manager.buttonsChanged(); |
| } |
| |
| @Override |
| public void filterChanged() { |
| model.fireTableDataChanged(); |
| UnitTab.this.manager.decorateTabTitle(UnitTab.this.table); |
| refreshState(); |
| } |
| }); |
| table.getInputMap ().put ( |
| KeyStroke.getKeyStroke (KeyEvent.VK_F10, KeyEvent.SHIFT_DOWN_MASK), |
| "org.netbeans.modules.autoupdate.ui.UnitTab.PopupActionSupport"); // NOI18N |
| table.getActionMap ().put ( |
| "org.netbeans.modules.autoupdate.ui.UnitTab.PopupActionSupport", // NOI18N |
| popupActionsSupport.popupOnF10); |
| |
| } |
| |
| void focusTable () { |
| SwingUtilities.invokeLater (new Runnable () { |
| @Override |
| public void run () { |
| table.requestFocusInWindow (); |
| } |
| }); |
| } |
| |
| UnitCategoryTableModel getModel () { |
| return model; |
| } |
| |
| UnitTable getTable () { |
| return table; |
| } |
| |
| public String getHelpId () { |
| return UnitTab.class.getName () + '.' + model.getType (); // NOI18N |
| } |
| |
| void setWaitingState (boolean waitingState) { |
| boolean enabled = !waitingState; |
| Component[] all = getComponents (); |
| for (Component component : all) { |
| if (component == bTabAction || component == bDeactivate || component == bUninstall) { |
| if (enabled) { |
| TabAction a = (TabAction) ((AbstractButton)component).getAction(); |
| component.setEnabled (a == null ? false : a.isEnabled()); |
| } else { |
| component.setEnabled (enabled); |
| } |
| } else { |
| if (component == spTab) { |
| spTab.getLeftComponent ().setEnabled (enabled); |
| spTab.getRightComponent ().setEnabled (enabled); |
| details.setEnabled (enabled); |
| table.setEnabled (enabled); |
| } else { |
| component.setEnabled (enabled); |
| } |
| } |
| } |
| if (reloadAction != null) { |
| reloadAction.setEnabled (enabled); |
| } |
| Component parent = getParent (); |
| Component rootPane = getRootPane (); |
| if (parent != null) { |
| parent.setEnabled (enabled); |
| } |
| if (rootPane != null) { |
| if (enabled) { |
| rootPane.setCursor (null); |
| } else { |
| rootPane.setCursor (Cursor.getPredefinedCursor (Cursor.WAIT_CURSOR)); |
| } |
| } |
| focusTable (); |
| } |
| |
| private void prepareTopButton (Action action) { |
| if(action!=null) { |
| topButton.setToolTipText ((String)action.getValue (JComponent.TOOL_TIP_TEXT_KEY)); |
| topButton.setAction (action); |
| topButton.setVisible(true); |
| } else { |
| topButton.setVisible(false); |
| } |
| } |
| |
| @Override |
| public void addNotify () { |
| super.addNotify (); |
| if (dlForSearch == null) { |
| tfSearch.getDocument ().addDocumentListener (getDocumentListener ()); |
| } |
| |
| if (flForSearch == null) { |
| flForSearch = new FocusListener() { |
| @Override |
| public void focusGained(FocusEvent e) { |
| tfSearch.selectAll(); |
| } |
| |
| @Override |
| public void focusLost(FocusEvent e) { |
| tfSearch.select(0, 0); |
| } |
| }; |
| tfSearch.addFocusListener(flForSearch); |
| } |
| RequestProcessor.Task runningTask = PluginManagerUI.getRunningTask (new Runnable() { |
| |
| @Override |
| public void run() { |
| if (isWaitingForExternal) { |
| reloadTask (false).schedule (10); |
| isWaitingForExternal = false; |
| } |
| } |
| }); |
| synchronized (this) { |
| if (runningTask != null && ! runningTask.isFinished () && ! isWaitingForExternal) { |
| isWaitingForExternal = true; |
| runningTask.addTaskListener (new TaskListener () { |
| @Override |
| public void taskFinished (org.openide.util.Task task) { |
| if (isWaitingForExternal) { |
| reloadTask (false).schedule (10); |
| } |
| isWaitingForExternal = false; |
| } |
| }); |
| } |
| } |
| } |
| |
| @Override |
| public void removeNotify () { |
| super.removeNotify (); |
| if (dlForSearch != null) { |
| tfSearch.getDocument ().removeDocumentListener (getDocumentListener ()); |
| } |
| dlForSearch = null; |
| if (flForSearch != null) { |
| tfSearch.removeFocusListener(flForSearch); |
| } |
| flForSearch = null; |
| Preferences p = NbPreferences.root().node("/org/netbeans/modules/autoupdate");//NOI18N |
| if (preferenceChangeListener != null) { |
| p.removePreferenceChangeListener (preferenceChangeListener); |
| preferenceChangeListener = null; |
| } |
| } |
| |
| private Collection<Unit> oldUnits = Collections.emptySet (); |
| |
| public void refreshState () { |
| detailView.setVisible(this.model.supportsTwoViews()); |
| final Collection<Unit> units = model.getMarkedUnits (); |
| if (oldUnits.equals (units)) { |
| return ; |
| } |
| oldUnits = units; |
| popupActionsSupport.tableDataChanged (); |
| buttonsActionsSupport.tableDataChanged(); |
| |
| if (units.isEmpty()) { |
| cleanSelectionInfo (); |
| } else { |
| setSelectionInfo (null, units.size ()); |
| } |
| getDefaultAction ().tableDataChanged(units); |
| boolean alreadyScheduled = false; |
| if (getDownloadSizeTask != null) { |
| if (getDownloadSizeTask.getDelay () > 0) { |
| getDownloadSizeTask.schedule (1000); |
| alreadyScheduled = true; |
| } else if (! getDownloadSizeTask.isFinished ()) { |
| getDownloadSizeTask.cancel (); |
| } |
| } |
| if (units.size () > 0 && ! alreadyScheduled) { |
| getDownloadSizeTask = DOWNLOAD_SIZE_PROCESSOR.post (new Runnable () { |
| @Override |
| public void run () { |
| int downloadSize = model.getDownloadSize (); |
| if (Thread.interrupted ()) { |
| return ; |
| } |
| if (model.getMarkedUnits ().isEmpty()) { |
| cleanSelectionInfo (); |
| } else { |
| setSelectionInfo (Utilities.getDownloadSizeAsString (downloadSize), model.getMarkedUnits ().size ()); |
| } |
| } |
| }, 150); |
| } |
| } |
| |
| final void updateTab(final Map<String, Boolean> state) { |
| final Runnable addUpdates = new Runnable() { |
| @Override |
| public void run() { |
| final LocallyDownloadedTableModel downloadedTableModel = ((LocallyDownloadedTableModel) model); |
| List<UpdateUnit> empty = Collections.emptyList(); |
| downloadedTableModel.setUnits(empty); |
| SwingUtilities.invokeLater(new Runnable() { |
| |
| @Override |
| public void run() { |
| fireUpdataUnitChange(); |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| refreshState(); |
| setWaitingState(false); |
| } |
| }); |
| } |
| }; |
| setWaitingState(true); |
| Utilities.startAsWorkerThread(addUpdates, 250); |
| } |
| |
| private TabAction getDefaultAction () { |
| return (TabAction)bTabAction.getAction (); |
| } |
| |
| private void initTab () { |
| RowTabAction[] forPopup = null; |
| TabAction[] forButtons = null; |
| switch (model.getType ()) { |
| case INSTALLED : |
| { |
| RowTabAction checkCategoryAction = new CheckCategoryAction (); |
| RowTabAction uncheckCategoryAction = new UncheckCategoryAction (); |
| RowTabAction checkAllAction = new CheckAllAction (); |
| RowTabAction uncheckAllAction = new UncheckAllAction (); |
| RowTabAction activateCategoryAction = new ActivateCategoryAction (); |
| RowTabAction deactivateCategoryAction = new DeactivateCategoryAction (); |
| |
| ActivateAction activateAction = new ActivateAction (); |
| DeactivateAction deactivateAction = new DeactivateAction (); |
| UninstallAction uninstallAction = new UninstallAction(); |
| |
| ActivateRowAction activateRowAction = new ActivateRowAction(); |
| DeactivateRowAction deactivateRowAction = new DeactivateRowAction(); |
| UninstallRowAction uninstallRowAction = new UninstallRowAction(); |
| |
| forPopup = new RowTabAction[] { |
| activateRowAction, deactivateRowAction, |
| activateCategoryAction, deactivateCategoryAction, |
| checkCategoryAction, uncheckCategoryAction, |
| checkAllAction, uncheckAllAction, new CheckAction(), |
| uninstallRowAction |
| }; |
| |
| forButtons = new TabAction[] { |
| activateAction, deactivateAction, uninstallAction |
| }; |
| |
| bDeactivate.setVisible(true); |
| bUninstall.setVisible(true); |
| bTabAction.setAction(activateAction); |
| bDeactivate.setAction(deactivateAction); |
| bUninstall.setAction (uninstallAction); |
| prepareTopButton (null/*reloadAction = new ReloadAction ()*/); |
| table.setEnableRenderer (new EnableRenderer ()); |
| initReloadTooltip(); |
| break; |
| } |
| |
| case UPDATE : |
| { |
| RowTabAction selectCategoryAction = new CheckCategoryAction (); |
| RowTabAction deselectCategoryAction = new UncheckCategoryAction (); |
| RowTabAction selectAllAction = new CheckAllAction (); |
| RowTabAction deselectAllAction = new UncheckAllAction (); |
| moreAction = new MoreAction(); |
| lessAction = new LessAction(); |
| |
| forPopup = new RowTabAction[] { |
| new UpdateRowAction(), |
| selectCategoryAction, deselectCategoryAction, |
| selectAllAction, deselectAllAction, new CheckAction (), |
| moreAction, lessAction |
| }; |
| } |
| bTabAction.setAction (new UpdateAction ()); |
| bDeactivate.setVisible(false); |
| bUninstall.setVisible(false); |
| prepareTopButton (reloadAction = new ReloadAction ("UnitTab_ReloadActionUpdates")); |
| initReloadTooltip(); |
| break; |
| |
| case AVAILABLE : |
| { |
| RowTabAction selectCategoryAction = new CheckCategoryAction (); |
| RowTabAction deselectCategoryAction = new UncheckCategoryAction (); |
| RowTabAction selectAllAction = new CheckAllAction (); |
| RowTabAction deselectAllAction = new UncheckAllAction (); |
| moreAction = new MoreAction(); |
| lessAction = new LessAction(); |
| |
| forPopup = new RowTabAction[] { |
| new AvailableRowAction(), |
| selectCategoryAction, deselectCategoryAction, |
| selectAllAction, deselectAllAction, new CheckAction (), |
| moreAction, lessAction |
| }; |
| } |
| bTabAction.setAction (new AvailableAction ()); |
| bDeactivate.setVisible(false); |
| bUninstall.setVisible(false); |
| prepareTopButton (reloadAction = new ReloadAction ("UnitTab_ReloadAction")); |
| table.setEnableRenderer (new SourceCategoryRenderer ()); |
| initReloadTooltip(); |
| break; |
| |
| case LOCAL : |
| removeLocallyDownloaded = new RemoveLocallyDownloadedAction (); |
| forPopup = new RowTabAction[]{ |
| new LocalUpdateRowAction(), |
| removeLocallyDownloaded, new CheckAction() |
| }; |
| bTabAction.setAction (new LocalUpdateAction ()); |
| bDeactivate.setVisible(false); |
| bUninstall.setVisible(false); |
| prepareTopButton (new AddLocallyDownloadedAction ()); |
| break; |
| } |
| model.addTableModelListener (new TableModelListener () { |
| @Override |
| public void tableChanged (TableModelEvent e) { |
| refreshState (); |
| } |
| }); |
| table.addMouseListener (popupActionsSupport = new PopupActionSupport (forPopup)); |
| buttonsActionsSupport = new ButtonActionSupport(forButtons); |
| getDefaultAction ().setEnabled (model.getMarkedUnits ().size () > 0); |
| } |
| |
| |
| private void cleanSelectionInfo () { |
| lSelectionInfo.setText (""); |
| lWarning.setText (""); |
| lWarning.setIcon (null); |
| } |
| |
| private void setSelectionInfo (String downloadSize, int count) { |
| String operationNameKey = null; |
| switch (model.getType ()) { |
| case INSTALLED : |
| operationNameKey = "UnitTab_OperationName_Text_INSTALLED"; |
| break; |
| case UPDATE : |
| operationNameKey = "UnitTab_OperationName_Text_UPDATE"; |
| break; |
| case AVAILABLE : |
| operationNameKey = "UnitTab_OperationName_Text_AVAILABLE"; |
| break; |
| case LOCAL : |
| operationNameKey = "UnitTab_OperationName_Text_LOCAL"; |
| break; |
| } |
| String key = count == 1 ? "UnitTab_lHowManySelected_Single_Text" : "UnitTab_lHowManySelected_Many_Text"; |
| if (UnitCategoryTableModel.Type.INSTALLED == model.getType () || UnitCategoryTableModel.Type.LOCAL == model.getType ()) { |
| lSelectionInfo.setText ((NbBundle.getMessage (UnitTab.class, key, count))); |
| } else { |
| if (downloadSize == null) { |
| lSelectionInfo.setText ((NbBundle.getMessage (UnitTab.class, key, count))); |
| } else { |
| lSelectionInfo.setText (NbBundle.getMessage (UnitTab.class, "UnitTab_lHowManySelected_TextFormatWithSize", |
| NbBundle.getMessage (UnitTab.class, key, count), downloadSize)); |
| } |
| } |
| if (model.needsRestart ()) { |
| Icon warningIcon = ImageUtilities.loadImageIcon("org/netbeans/modules/autoupdate/ui/resources/warning.gif", false); // NOI18N |
| lWarning.setIcon (warningIcon); |
| lWarning.setText (NbBundle.getMessage (UnitTab.class, "UnitTab_lWarning_Text", NbBundle.getMessage (UnitTab.class, operationNameKey))); // NOI18N |
| } |
| } |
| |
| private void showDetailsAtRow (int row) { |
| showDetailsAtRow (row, null); |
| } |
| |
| private void showDetailsAtRow (int row, Action action) { |
| if (row == -1) { |
| details.setUnit (null); |
| } else { |
| Unit u = model.isExpansionControlAtRow(row) ? null : model.getUnitAtRow (row); |
| if (u == null) { |
| //TODO: add details about more ... or les ... |
| } else { |
| details.setUnit (u, action); |
| } |
| } |
| } |
| |
| private void listenOnSelection () { |
| table.getSelectionModel ().addListSelectionListener (new ListSelectionListener () { |
| @Override |
| public void valueChanged (final ListSelectionEvent e) { |
| if (! SwingUtilities.isEventDispatchThread()) { |
| SwingUtilities.invokeLater(new Runnable() { |
| |
| @Override |
| public void run() { |
| valueChanged(e); |
| } |
| }); |
| return ; |
| } |
| //Ignore extra messages. |
| if (e.getValueIsAdjusting()) { |
| return; |
| } |
| ListSelectionModel lsm = |
| (ListSelectionModel)e.getSource (); |
| if (lsm.isSelectionEmpty ()) { |
| //no rows are selected |
| showDetailsAtRow (-1); |
| popupActionsSupport.rowChanged (-1); |
| } else { |
| int selectedRow = table.convertRowIndexToModel(lsm.getMinSelectionIndex()); |
| popupActionsSupport.rowChanged (selectedRow); |
| //selectedRow is selected |
| Action action = null; |
| if (removeLocallyDownloaded != null && removeLocallyDownloaded.isEnabled()) { |
| action = removeLocallyDownloaded; |
| } |
| showDetailsAtRow (selectedRow, action); |
| } |
| } |
| }); |
| } |
| |
| public void addUpdateUnitListener (UpdateUnitListener l) { |
| model.addUpdateUnitListener (l); |
| } |
| |
| public void removeUpdateUnitListener (UpdateUnitListener l) { |
| model.removeUpdateUnitListener (l); |
| } |
| |
| void fireUpdataUnitChange () { |
| model.fireUpdataUnitChange (); |
| } |
| |
| DocumentListener getDocumentListener () { |
| if (dlForSearch == null) { |
| dlForSearch = new DocumentListener () { |
| @Override |
| public void insertUpdate (DocumentEvent arg0) { |
| filter = tfSearch.getText ().trim (); |
| searchTask.schedule (350); |
| } |
| |
| @Override |
| public void removeUpdate (DocumentEvent arg0) { |
| insertUpdate (arg0); |
| } |
| |
| @Override |
| public void changedUpdate (DocumentEvent arg0) { |
| insertUpdate (arg0); |
| } |
| |
| }; |
| } |
| return dlForSearch; |
| } |
| |
| /** This method is called from within the constructor to |
| * initialize the form. |
| * WARNING: Do NOT modify this code. The content of this method is |
| * always regenerated by the Form Editor. |
| */ |
| // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents |
| private void initComponents() { |
| |
| lSelectionInfo = new javax.swing.JLabel(); |
| bTabAction = new javax.swing.JButton(); |
| lSearch = new javax.swing.JLabel(); |
| tfSearch = new javax.swing.JTextField(); |
| spTab = new javax.swing.JSplitPane(); |
| topButton = new javax.swing.JButton(); |
| lWarning = new javax.swing.JLabel(); |
| detailView = new javax.swing.JCheckBox(); |
| bDeactivate = new javax.swing.JButton(); |
| bUninstall = new javax.swing.JButton(); |
| |
| lSearch.setLabelFor(tfSearch); |
| org.openide.awt.Mnemonics.setLocalizedText(lSearch, org.openide.util.NbBundle.getMessage(UnitTab.class, "lSearch1.text")); // NOI18N |
| |
| spTab.setBorder(null); |
| spTab.setDividerLocation(Integer.parseInt(NbBundle.getMessage (UnitTab.class, "UnitTab_Splitter_DefaultDividerLocation"))); |
| spTab.setResizeWeight(0.5); |
| spTab.setOneTouchExpandable(true); |
| |
| org.openide.awt.Mnemonics.setLocalizedText(topButton, "jButton1"); |
| |
| detailViewInit(); |
| org.openide.awt.Mnemonics.setLocalizedText(detailView, org.openide.util.NbBundle.getMessage(UnitTab.class, "UnitTab.detailView.text")); // NOI18N |
| detailView.addItemListener(new java.awt.event.ItemListener() { |
| public void itemStateChanged(java.awt.event.ItemEvent evt) { |
| detailViewItemStateChanged(evt); |
| } |
| }); |
| |
| javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
| this.setLayout(layout); |
| layout.setHorizontalGroup( |
| layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
| .addGroup(layout.createSequentialGroup() |
| .addContainerGap() |
| .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
| .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
| .addComponent(topButton) |
| .addGap(18, 18, 18) |
| .addComponent(detailView) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 443, Short.MAX_VALUE) |
| .addComponent(lSearch) |
| .addGap(4, 4, 4) |
| .addComponent(tfSearch, javax.swing.GroupLayout.PREFERRED_SIZE, 114, javax.swing.GroupLayout.PREFERRED_SIZE)) |
| .addComponent(spTab, javax.swing.GroupLayout.DEFAULT_SIZE, 776, Short.MAX_VALUE) |
| .addGroup(layout.createSequentialGroup() |
| .addComponent(bTabAction) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
| .addComponent(bDeactivate) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
| .addComponent(bUninstall) |
| .addGap(8, 8, 8) |
| .addComponent(lSelectionInfo) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) |
| .addComponent(lWarning, javax.swing.GroupLayout.DEFAULT_SIZE, 542, Short.MAX_VALUE) |
| .addGap(99, 99, 99))) |
| .addContainerGap()) |
| ); |
| layout.setVerticalGroup( |
| layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
| .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
| .addContainerGap() |
| .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER) |
| .addComponent(tfSearch, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) |
| .addComponent(lSearch) |
| .addComponent(topButton) |
| .addComponent(detailView)) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
| .addComponent(spTab, javax.swing.GroupLayout.DEFAULT_SIZE, 73, Short.MAX_VALUE) |
| .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
| .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER, false) |
| .addComponent(bTabAction) |
| .addComponent(lSelectionInfo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
| .addComponent(lWarning) |
| .addComponent(bDeactivate) |
| .addComponent(bUninstall)) |
| .addContainerGap()) |
| ); |
| |
| layout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {lSelectionInfo, lWarning}); |
| |
| lSearch.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UnitTab.class, "ACD_Search")); // NOI18N |
| topButton.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(UnitTab.class, "ACN_Reload")); // NOI18N |
| topButton.getAccessibleContext().setAccessibleDescription(org.openide.util.NbBundle.getMessage(UnitTab.class, "ACD_Reload")); // NOI18N |
| }// </editor-fold>//GEN-END:initComponents |
| |
| private void detailViewItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_detailViewItemStateChanged |
| if (this.model.supportsTwoViews()) { |
| manager.setDetailView(detailView.isSelected()); |
| uncheckAll(); |
| manager.updateUnitsChanged(); |
| System.setProperty(PluginManagerUI.DETAIL_VIEW_SELECTED_PROP, "" + detailView.isSelected()); |
| } |
| }//GEN-LAST:event_detailViewItemStateChanged |
| |
| private void detailViewInit() { |
| detailView.setVisible(this.model.supportsTwoViews()); |
| if (this.model.supportsTwoViews()) { |
| detailView.setSelected(Boolean.getBoolean(PluginManagerUI.DETAIL_VIEW_SELECTED_PROP)); |
| } |
| } |
| |
| private LocalDownloadSupport getLocalDownloadSupport () { |
| return (model instanceof LocallyDownloadedTableModel) ? ((LocallyDownloadedTableModel)model).getLocalDownloadSupport () : null; |
| } |
| |
| private Task reloadTask (final boolean force) { |
| final Runnable checkUpdates = new Runnable (){ |
| @Override |
| public void run () { |
| ProgressHandle handle = ProgressHandleFactory.createHandle (NbBundle.getMessage (UnitTab.class, ("UnitTab_ReloadAction"))); |
| JComponent progressComp = ProgressHandleFactory.createProgressComponent (handle); |
| JLabel detailLabel = new JLabel (NbBundle.getMessage (UnitTab.class, "UnitTab_PrepareReloadAction")); |
| manager.setProgressComponent (detailLabel, progressComp); |
| handle.setInitialDelay (0); |
| handle.start (); |
| manager.initTask.waitFinished (); |
| setWaitingState (true); |
| if (getDownloadSizeTask != null && ! getDownloadSizeTask.isFinished ()) { |
| if (getDownloadSizeTask.getDelay () > 0) { |
| getDownloadSizeTask.cancel (); |
| } else { |
| getDownloadSizeTask.waitFinished (); |
| } |
| } |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| if (model instanceof LocallyDownloadedTableModel) { |
| ((LocallyDownloadedTableModel) model).removeInstalledUnits (); |
| ((LocallyDownloadedTableModel) model).setUnits (null); |
| } |
| manager.unsetProgressComponent (detailLabel, progressComp); |
| Utilities.presentRefreshProviders (manager, force); |
| SwingUtilities.invokeLater (new Runnable () { |
| @Override |
| public void run () { |
| fireUpdataUnitChange (); |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| restoreSelectedRow (row); |
| refreshState (); |
| setWaitingState (false); |
| } |
| }); |
| } |
| }; |
| return Utilities.startAsWorkerThread (checkUpdates); |
| } |
| |
| class ButtonActionSupport { |
| |
| private final TabAction[] actions; |
| |
| ButtonActionSupport(TabAction[] actions) { |
| this.actions = actions; |
| } |
| |
| void tableDataChanged() { |
| if (actions != null) { |
| Collection<Unit> units = model.getMarkedUnits(); |
| for (TabAction ta : actions) { |
| ta.tableDataChanged(units); |
| } |
| } |
| } |
| } |
| |
| class PopupActionSupport extends MouseAdapter implements Runnable { |
| private final RowTabAction[] actions; |
| |
| PopupActionSupport (RowTabAction[] actions) { |
| this.actions = actions; |
| } |
| |
| void rowChanged (int row) { |
| Unit u = null; |
| if (row > -1) { |
| u = model.getUnitAtRow (row); |
| } |
| |
| for (TabAction action : actions) { |
| if (action instanceof RowTabAction) { |
| RowTabAction rowAction = (RowTabAction)action; |
| rowAction.unitChanged (row, u); |
| } |
| } |
| } |
| |
| void tableDataChanged () { |
| Collection<Unit> units = model.getMarkedUnits (); |
| for (RowTabAction action : actions) { |
| action.tableDataChanged (units); |
| } |
| } |
| |
| private JPopupMenu createPopup () { |
| JPopupMenu popup = new JPopupMenu (); |
| for (RowTabAction action : actions) { |
| if (action.isVisible ()) { |
| popup.add (new JMenuItem (action)); |
| } |
| } |
| return popup; |
| } |
| |
| @Override |
| public void mousePressed (MouseEvent e) { |
| maybeShowPopup (e); |
| } |
| |
| @Override |
| public void mouseReleased (MouseEvent e) { |
| maybeShowPopup (e); |
| } |
| |
| @Override |
| public void mouseClicked (MouseEvent e) { |
| if (!maybeShowPopup (e)) { |
| int row = UnitTab.this.table.rowAtPoint(e.getPoint()); |
| if (model.isExpansionControlAtRow(row)) { |
| moreAction.unitChanged(row, null); |
| lessAction.unitChanged(row, null); |
| if (moreAction.isEnabled()) { |
| moreAction.performAction(); |
| } else if (lessAction.isEnabled()) { |
| lessAction.performAction(); |
| } |
| } |
| } |
| } |
| |
| private boolean maybeShowPopup (MouseEvent e) { |
| if (e.isPopupTrigger ()) { |
| focusTable (); |
| showPopup (e.getPoint (), e.getComponent ()); |
| return true; |
| } |
| return false; |
| } |
| |
| @Override |
| public void run () { |
| Point p = getPositionForPopup(); |
| |
| if (p != null) { |
| showPopup (p, table); |
| } |
| } |
| |
| private Point getPositionForPopup () { |
| int r = table.getSelectedRow (); |
| int c = table.getSelectedColumn (); |
| |
| if (r < 0 || c < 0) { |
| return null; |
| } |
| |
| Rectangle rect = table.getCellRect (r, c, false); |
| |
| if (rect == null) { |
| return null; |
| } |
| |
| return SwingUtilities.convertPoint (table, rect.x, rect.y, table); |
| } |
| |
| public final Action popupOnF10 = new AbstractAction () { |
| |
| @Override |
| public void actionPerformed (ActionEvent evt) { |
| popupActionsSupport.run (); |
| } |
| |
| @Override |
| public boolean isEnabled () { |
| return table.isFocusOwner (); |
| } |
| }; |
| |
| } |
| |
| private void showPopup (Point e, Component invoker) { |
| int row = UnitTab.this.table.rowAtPoint (e); |
| if (row >= 0) { |
| table.getSelectionModel ().setSelectionInterval (row, row); |
| final JPopupMenu finalPopup = popupActionsSupport.createPopup (); |
| if (finalPopup != null && finalPopup.getComponentCount () > 0) { |
| finalPopup.show (invoker,e.x, e.y); |
| |
| } |
| } |
| } |
| |
| private int getSelectedRow () { |
| return table.getSelectedRow (); |
| } |
| private void restoreSelectedRow (int row) { |
| if (row < 0) { |
| row = 0; |
| } |
| for(int temp = row; temp >= 0; temp--) { |
| if (temp < table.getRowCount () && temp > -1) { |
| table.getSelectionModel ().setSelectionInterval (temp, temp); |
| break; |
| } |
| } |
| } |
| int findRow(String codeName) { |
| for (int i = 0; i < model.getRowCount();i++) { |
| Unit u = model.getUnitAtRow(i); |
| if (u != null && codeName.equals(u.updateUnit.getCodeName())) { |
| return i; |
| } |
| } |
| return -1; |
| } |
| |
| |
| private void initReloadTooltip() { |
| Preferences p = NbPreferences.root().node("/org/netbeans/modules/autoupdate");//NOI18N |
| long lastTime = p.getLong(PROP_LAST_CHECK, 0); |
| if (lastTime > 0) { |
| topButton.setToolTipText("<html>"+NbBundle.getMessage(UnitTab.class, "UnitTab_ReloadTime", //NOI18N |
| "<b>"+new SimpleDateFormat().format(new Date(lastTime)) + "</b>")+"</html>"); |
| } else { |
| String never = NbBundle.getMessage(UnitTab.class, "UnitTab_ReloadTime_Never");//NOI18N |
| topButton.setToolTipText("<html>"+NbBundle.getMessage(UnitTab.class, "UnitTab_ReloadTime", "<b>"+never+"</b>") + "/<html>");//NOI18N |
| } |
| if (preferenceChangeListener == null) { |
| preferenceChangeListener = new PreferenceChangeListener() { |
| |
| @Override |
| public void preferenceChange(PreferenceChangeEvent evt) { |
| SwingUtilities.invokeLater(new Runnable() { |
| |
| @Override |
| public void run() { |
| initReloadTooltip(); |
| } |
| }); |
| } |
| }; |
| p.addPreferenceChangeListener(preferenceChangeListener); |
| } |
| } |
| |
| |
| static String textForKey (String key) { |
| JButton jb = new JButton (); |
| Mnemonics.setLocalizedText (jb, NbBundle.getMessage (UnitTab.class, key)); |
| return jb.getText (); |
| } |
| |
| static int mnemonicForKey(String key) { |
| JButton jb = new JButton(); |
| Mnemonics.setLocalizedText(jb, NbBundle.getMessage(UnitTab.class, key)); |
| return jb.getMnemonic(); |
| } |
| |
| private abstract class TabAction extends AbstractAction { |
| private String name; |
| private String actionCategory; |
| public TabAction (String nameKey, KeyStroke accelerator, String actionCategoryKey) { |
| super (textForKey (nameKey)); |
| this.actionCategory = actionCategoryKey;//(actionCategoryKey != null) ? NbBundle.getMessage(UnitTab.class, actionCategoryKey) : null; |
| if(accelerator!=null) { |
| putValue (ACCELERATOR_KEY, accelerator); |
| } |
| |
| putValue (MNEMONIC_KEY, mnemonicForKey (nameKey)); |
| name = (String)getValue (NAME); |
| putIntoActionMap (table); |
| } |
| |
| public TabAction (String key, String actionCategoryKey) { |
| this (key, null, actionCategoryKey); |
| } |
| |
| protected String getActionName () { |
| return name; |
| } |
| |
| public String getActionCategory () { |
| return getActionCategoryImpl ();//NOI18N |
| } |
| |
| protected String getActionCategoryImpl () { |
| return actionCategory; |
| } |
| |
| protected void setContextName (String name) { |
| putValue (NAME, name); |
| } |
| |
| @Override |
| public void setEnabled (boolean enabled) { |
| if (isEnabled () != enabled) { |
| if (enabled) { |
| RequestProcessor.Task t = PluginManagerUI.getRunningTask (new Runnable () { |
| |
| @Override |
| public void run() { |
| setEnabled (true); |
| } |
| }); |
| if (t != null && ! t.isFinished ()) { |
| t.addTaskListener (new TaskListener () { |
| @Override |
| public void taskFinished (org.openide.util.Task task) { |
| setEnabled (true); |
| } |
| }); |
| } else { |
| super.setEnabled (true); |
| } |
| } else { |
| super.setEnabled (false); |
| } |
| } |
| } |
| |
| private void putIntoActionMap (JComponent component) { |
| KeyStroke ks = (KeyStroke)getValue (ACCELERATOR_KEY); |
| Object key = getValue (NAME); |
| if (ks == null) { |
| ks = KeyStroke.getKeyStroke ((Integer)getValue (MNEMONIC_KEY), KeyEvent.ALT_DOWN_MASK); |
| } |
| if (ks != null && key != null) { |
| component.getInputMap (JComponent.WHEN_FOCUSED).put (ks, key); |
| component.getActionMap ().put (key,this); |
| } |
| } |
| |
| public final void performAction () { |
| if (isEnabled ()) { |
| actionPerformed (null); |
| } |
| } |
| @Override |
| public final void actionPerformed (ActionEvent e) { |
| try { |
| performerImpl (); |
| } finally { |
| } |
| } |
| |
| |
| public void tableDataChanged () { |
| tableDataChanged (model.getMarkedUnits ()); |
| } |
| |
| public void tableDataChanged (Collection<Unit> units) { |
| setEnabled (units.size () > 0); |
| } |
| |
| |
| public abstract void performerImpl (); |
| } |
| |
| private abstract class RowTabAction extends TabAction { |
| private Unit u; |
| private int row; |
| public RowTabAction (String nameKey, String actionCategoryKey) { |
| super (nameKey, actionCategoryKey); |
| } |
| |
| public RowTabAction (String nameKey, KeyStroke accelerator, String actionCategoryKey) { |
| super (nameKey, accelerator, actionCategoryKey); |
| } |
| public void unitChanged (int row, Unit u) { |
| this.u = u; |
| this.row = row; |
| unitChanged(); |
| } |
| public final boolean isVisible (){ |
| return (u != null) ? isVisible (u) : isVisible(row); |
| } |
| private void unitChanged () { |
| if (u != null) { |
| setEnabled (isEnabled (u)); |
| setContextName (getContextName (u)); |
| } else { |
| setEnabled (isEnabled(row)); |
| setContextName (getContextName(row)); |
| } |
| } |
| |
| @Override |
| public void tableDataChanged () { |
| unitChanged (); |
| } |
| |
| @Override |
| public void tableDataChanged (Collection<Unit> units) { |
| unitChanged (); |
| } |
| |
| @Override |
| public final void performerImpl () { |
| performerImpl (u); |
| } |
| protected boolean isVisible (Unit u) { |
| return u != null; |
| } |
| protected boolean isVisible (int row) { |
| return false; |
| } |
| public abstract void performerImpl (Unit u); |
| protected abstract boolean isEnabled (Unit u); |
| protected boolean isEnabled (int row) { |
| return false; |
| } |
| protected abstract String getContextName (Unit u); |
| protected String getContextName (int row) { |
| return getActionName(); |
| } |
| } |
| |
| private class CheckAction extends RowTabAction { |
| public CheckAction () { |
| super ("UnitTab_CheckAction", KeyStroke.getKeyStroke (KeyEvent.VK_SPACE, 0), null); |
| } |
| |
| @Override |
| public void performerImpl (Unit u) { |
| final int row = getSelectedRow(); |
| if (model.isExpansionControlAtRow(row)) { |
| if (moreAction != null && moreAction.isEnabled()) { |
| moreAction.performAction(); |
| } else if (lessAction != null && lessAction.isEnabled()) { |
| lessAction.performAction(); |
| } |
| } else if (u != null && u.canBeMarked ()) { |
| u.setMarked (!u.isMarked ()); |
| } |
| model.fireTableDataChanged (); |
| restoreSelectedRow(row); |
| } |
| |
| |
| @Override |
| protected boolean isEnabled (Unit u) { |
| return u != null && u.canBeMarked (); |
| } |
| |
| @Override |
| protected boolean isEnabled (int row) { |
| return model.isExpansionControlAtRow(row); |
| } |
| |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName (); |
| } |
| |
| @Override |
| protected boolean isVisible (Unit u) { |
| return false; |
| } |
| @Override |
| protected boolean isVisible (int row) { |
| return false; |
| } |
| |
| } |
| |
| private class UninstallAction extends TabAction { |
| public UninstallAction () { |
| super ("UnitTab_bTabAction_Name_INSTALLED", null); |
| } |
| |
| @Override |
| public void performerImpl () { |
| boolean wizardFinished = false; |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| try { |
| wizardFinished = wizard.invokeWizard (); |
| } finally { |
| Containers.forUninstall ().removeAll (); |
| Containers.forDisable().removeAll (); |
| Containers.forEnable().removeAll (); |
| fireUpdataUnitChange (); |
| if (!wizardFinished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| restoreSelectedRow(row); |
| refreshState (); |
| focusTable (); |
| } |
| } |
| |
| @Override |
| public void tableDataChanged (Collection<Unit> units) { |
| if (units.isEmpty()) { |
| setEnabled(false); |
| return; |
| } |
| for (Unit u : units) { |
| if (u instanceof Unit.Installed) { |
| Unit.Installed inst = (Unit.Installed)u; |
| if (inst.isUninstallAllowed()) { |
| setEnabled(true); |
| return; |
| } |
| } |
| } |
| setEnabled (false); |
| } |
| |
| } |
| |
| private class UpdateAction extends TabAction { |
| public UpdateAction () { |
| super ("UnitTab_bTabAction_Name_UPDATE", null); |
| } |
| |
| @Override |
| public void performerImpl () { |
| boolean wizardFinished = false; |
| final int row = getSelectedRow(); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits()); |
| try { |
| wizardFinished = new InstallUnitWizard ().invokeWizard (OperationType.UPDATE, manager); |
| } finally { |
| if (manager == null || ! manager.isClosing()) { |
| //must be called before restoreState |
| fireUpdataUnitChange (); |
| if (!wizardFinished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| restoreSelectedRow(row); |
| refreshState (); |
| focusTable (); |
| } |
| } |
| } |
| } |
| |
| private class UpdateRowAction extends RowTabAction { |
| public UpdateRowAction() { |
| super("UnitTab_UpdateRowAction", null); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Update)) { |
| retval = u.canBeMarked(); |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forUpdate().removeAll(); |
| if (u instanceof Unit.CompoundUpdate) { |
| Unit.CompoundUpdate uc = (Unit.CompoundUpdate) u; |
| OperationContainer container = Containers.forUpdate(); |
| for (UpdateUnit invisible : uc.getUpdateUnits()) { |
| if (container.canBeAdded(invisible, invisible.getAvailableUpdates().get(0))) { |
| container.add(invisible, invisible.getAvailableUpdates().get(0)); |
| } |
| } |
| } else { |
| Containers.forUpdate().add(u.updateUnit, u.getRelevantElement()); |
| } |
| boolean finished = false; |
| try { |
| if (Containers.forUpdate().listAll().size() > 0) { |
| finished = new InstallUnitWizard ().invokeWizard (OperationType.UPDATE, manager); |
| } |
| } finally { |
| Containers.forUpdate().removeAll(); |
| if (manager == null || ! manager.isClosing()) { |
| Containers.forUpdate().removeAll(); |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if (u != null) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class AvailableAction extends TabAction { |
| public AvailableAction () { |
| super ("UnitTab_bTabAction_Name_AVAILABLE", null); |
| } |
| |
| @Override |
| public void performerImpl () { |
| boolean wizardFinished = false; |
| final int row = getSelectedRow(); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits()); |
| try { |
| wizardFinished = new InstallUnitWizard ().invokeWizard (OperationType.INSTALL, manager); |
| } finally { |
| if (manager != null) { |
| fireUpdataUnitChange (); |
| } |
| if (!wizardFinished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| restoreSelectedRow(row); |
| refreshState (); |
| focusTable (); |
| } |
| } |
| } |
| |
| private class AvailableRowAction extends RowTabAction { |
| public AvailableRowAction() { |
| super("UnitTab_InstallRowAction", null); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Available)) { |
| retval = u.canBeMarked(); |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forAvailable().removeAll(); |
| if (u instanceof Unit.Available) { |
| Containers.forAvailable().add(u.updateUnit, u.getRelevantElement()); |
| } |
| boolean finished = false; |
| try { |
| if (Containers.forAvailable().listAll().size() > 0) { |
| finished = new InstallUnitWizard ().invokeWizard (OperationType.INSTALL, manager); |
| } |
| } finally { |
| Containers.forAvailable().removeAll(); |
| if (manager == null || ! manager.isClosing()) { |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if (u != null) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class LocalUpdateAction extends TabAction { |
| public LocalUpdateAction () { |
| super ("UnitTab_bTabAction_Name_LOCAL", null); |
| } |
| @Override |
| public void performerImpl () { |
| boolean wizardFinished = false; |
| final int row = getSelectedRow(); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| |
| try { |
| wizardFinished = new InstallUnitWizard ().invokeWizard (OperationType.LOCAL_DOWNLOAD, manager); |
| } finally { |
| // fireUpdataUnitChange (); |
| if (wizardFinished) { |
| reloadTask (false).schedule (10); |
| } else { |
| fireUpdataUnitChange (); |
| if (!wizardFinished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| restoreSelectedRow(row); |
| refreshState (); |
| } |
| focusTable (); |
| } |
| } |
| } |
| |
| private class LocalUpdateRowAction extends RowTabAction { |
| public LocalUpdateRowAction() { |
| super("UnitTab_LocalUpdateRowAction", null); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if (u != null) { |
| retval = u.canBeMarked(); |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forAvailableNbms().removeAll(); |
| Containers.forUpdateNbms().removeAll(); |
| if (u instanceof Unit.Available) { |
| Containers.forAvailableNbms().add(u.updateUnit, u.getRelevantElement()); |
| } else if (u instanceof Unit.Update) { |
| Containers.forUpdateNbms().add(u.updateUnit, u.getRelevantElement()); |
| } |
| boolean finished = false; |
| try { |
| if (Containers.forAvailableNbms().listAll().size() > 0 || Containers.forUpdateNbms().listAll().size() > 0) { |
| finished = new InstallUnitWizard ().invokeWizard (OperationType.LOCAL_DOWNLOAD, manager); |
| } |
| } finally { |
| Containers.forAvailableNbms().removeAll(); |
| Containers.forUpdateNbms().removeAll(); |
| if (manager == null || ! manager.isClosing()) { |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if (u != null) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class CheckCategoryAction extends RowTabAction { |
| protected CheckCategoryAction (String nameKey,KeyStroke stroke, String actionCategoryKey) { |
| super (nameKey, stroke, actionCategoryKey); |
| } |
| public CheckCategoryAction () { |
| super ("UnitTab_CheckCategoryAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK),*/ "Check"); |
| } |
| @Override |
| protected boolean isEnabled (Unit u) { |
| boolean retval = false; |
| String category = u.getCategoryName(); |
| List<Unit> units = model.getUnits(); |
| for (Unit unit : units) { |
| if (unit != null && category.equals(unit.getCategoryName()) && !unit.isMarked() && unit.canBeMarked()) { |
| retval = true; |
| break; |
| } |
| } |
| return retval; |
| } |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName () + " \"" + u.getCategoryName ()+"\"";//NOI18N |
| } |
| @Override |
| public void performerImpl (Unit u) { |
| String category = u.getCategoryName (); |
| int count = model.getRowCount (); |
| final int row = getSelectedRow(); |
| for (int i = 0; i < count; i++) { |
| u = model.getUnitAtRow (i); |
| if (u != null && category.equals (u.getCategoryName ()) && !u.isMarked () && u.canBeMarked ()) { |
| u.setMarked (true); |
| } |
| } |
| model.fireTableDataChanged (); |
| restoreSelectedRow(row); |
| } |
| |
| @Override |
| protected boolean isVisible (Unit u) { |
| if (u.getRelevantElement().getUpdateUnit().getType() == UpdateManager.TYPE.FEATURE) { |
| return false; |
| } |
| return super.isVisible (u); |
| } |
| } |
| |
| private class ActivateAction extends TabAction { |
| public ActivateAction () { |
| super ("UnitTab_ActivateAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_E, KeyEvent.CTRL_DOWN_MASK),*/ "EnableDisable"); |
| } |
| |
| @Override |
| public void tableDataChanged(Collection<Unit> units) { |
| if (units.isEmpty()) { |
| setEnabled(false); |
| return; |
| } |
| for (Unit u : units) { |
| if (isEnabled(u)) { |
| setEnabled(true); |
| return ; |
| } |
| } |
| setEnabled(false); |
| } |
| |
| boolean finished = false; |
| Map<String, Boolean> state; |
| |
| void clearContainers() { |
| Containers.forEnable().removeAll(); |
| Containers.forDisable().removeAll(); |
| Containers.forAvailable().removeAll(); |
| Containers.forUninstall ().removeAll(); |
| } |
| |
| /** |
| * Forces refresh of UI data. Replans work to EDT, but waits for the result. |
| * First waits until the download/install task completes, so that UI models |
| * for checking items are not suspended by the pending operation. |
| * <p/> |
| * Will <b>clean all containers</b> and populate them again from the UI. |
| * @return newly populated Container |
| */ |
| OperationContainer refreshData() { |
| if (!SwingUtilities.isEventDispatchThread()) { |
| final OperationContainer[] c = new OperationContainer[1]; |
| RequestProcessor.Task runningTask = PluginManagerUI.getRunningTask(); |
| if (runningTask != null) { |
| runningTask.waitFinished(); |
| } |
| try { |
| SwingUtilities.invokeAndWait(() -> { |
| c[0] = refreshData(); |
| }); |
| } catch (InterruptedException | InvocationTargetException ex) { |
| OperationContainer x = Containers.forEnable(); |
| x.removeAll(); |
| } |
| return c[0]; |
| } |
| refreshState (); |
| try { |
| clearContainers(); |
| fireUpdataUnitChange(); |
| } catch (Throwable t) { |
| t.printStackTrace(); |
| } |
| if(!finished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| return prepareContainer(); |
| } |
| |
| OperationContainer prepareContainer() { |
| OperationContainer<OperationSupport> c = Containers.forEnable(); |
| Collection<Unit> units = new ArrayList<>(); |
| for (Unit u : model.getUnits()) { |
| if (u.isMarked() && isEnabled(u)) { |
| units.add(u); |
| } |
| } |
| c.removeAll(); |
| for (Unit u : units) { |
| c.add(u.updateUnit, u.getRelevantElement()); |
| } |
| return c; |
| } |
| |
| @Override |
| public void performerImpl() { |
| final int row = getSelectedRow (); |
| state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| finished = false; |
| // unused, but hold the reference on stack. |
| OperationContainer c = prepareContainer(); |
| try { |
| finished = wizard.invokeWizard(true, this::refreshData); |
| } finally { |
| clearContainers(); |
| if (finished) { |
| for (Unit u : model.getMarkedUnits()) { |
| u.setMarked(false); |
| } |
| } |
| fireUpdataUnitChange(); |
| if(!finished) { |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| } |
| restoreSelectedRow(row); |
| refreshState (); |
| focusTable (); |
| } |
| } |
| |
| protected boolean isEnabled (Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| Unit.Installed i = (Unit.Installed)u; |
| if (!i.getRelevantElement ().isEnabled ()) { |
| retval = Unit.Installed.isOperationAllowed (u.updateUnit, u.getRelevantElement (), Containers.forEnable ()); |
| } |
| } |
| return retval; |
| } |
| protected String getContextName (Unit u) { |
| return getActionName (); |
| } |
| } |
| |
| private class ActivateCategoryAction extends RowTabAction { |
| public ActivateCategoryAction () { |
| super ("UnitTab_ActivateCategoryAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK),*/ "EnableDisable"); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| boolean retval = false; |
| |
| String category = uu.getCategoryName(); |
| List<Unit> units = model.getUnits(); |
| for (Unit u : units) { |
| if ((u != null) && (u instanceof Unit.Installed) && category.equals(u.getCategoryName())) { |
| Unit.Installed installed = (Unit.Installed) u; |
| if (!installed.getRelevantElement().isEnabled()) { |
| retval = Unit.Installed.isOperationAllowed(installed.updateUnit, installed.getRelevantElement(), Containers.forEnable()); |
| } |
| } |
| } |
| |
| return retval; |
| } |
| @Override |
| protected String getContextName (Unit u) { |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| return getActionName ()+ " \"" + u.getCategoryName () + "\""; |
| } |
| return getActionName (); |
| } |
| @Override |
| public void performerImpl (Unit uu) { |
| Unit.Installed unit = (Unit.Installed)uu; |
| final int row = getSelectedRow(); |
| |
| String category = unit.getCategoryName (); |
| int count = model.getRowCount (); |
| for (int i = 0; i < count; i++) { |
| Unit u = model.getUnitAtRow (i); |
| if ((u != null) && (u instanceof Unit.Installed) && category.equals (u.getCategoryName ())) { |
| Unit.Installed installed = (Unit.Installed)u; |
| if (!installed.getRelevantElement().isEnabled() && !installed.updateUnit.isPending()) { |
| OperationInfo info = Containers.forEnable ().add (installed.updateUnit, installed.getRelevantElement ()); |
| if (info == null) { |
| Logger.getLogger(UnitTab.class.getName()).log(Level.WARNING, "Null OperationInfo for {0}", installed.getRelevantElement()); |
| } |
| } |
| } |
| } |
| |
| if (Containers.forEnable ().listAll ().size () > 0) { |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| wizard.invokeWizard (true); |
| Containers.forEnable ().removeAll (); |
| } |
| fireUpdataUnitChange (); |
| restoreSelectedRow(row); |
| focusTable(); |
| } |
| |
| @Override |
| protected boolean isVisible (Unit u) { |
| if (u.getRelevantElement().getUpdateUnit().getType() == UpdateManager.TYPE.FEATURE) { |
| return false; |
| } |
| return isEnabled(); |
| } |
| } |
| |
| private class DeactivateAction extends TabAction { |
| public DeactivateAction () { |
| super ("UnitTab_DeactivateAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_D, KeyEvent.CTRL_DOWN_MASK),*/ "EnableDisable"); |
| } |
| |
| @Override |
| public void tableDataChanged(Collection<Unit> units) { |
| if (units.isEmpty()) { |
| setEnabled(false); |
| return; |
| } |
| |
| for (Unit u : units) { |
| if (isEnabled(u)) { |
| setEnabled(true); |
| return; |
| } |
| } |
| setEnabled(false); |
| } |
| |
| @Override |
| public void performerImpl() { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| OperationContainer<OperationSupport> c = Containers.forDisable(); |
| for (Unit u : model.getUnits()) { |
| if (u.isMarked() && isEnabled(u)) { |
| c.add(u.updateUnit, u.getRelevantElement()); |
| } |
| } |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| boolean finished = false; |
| try { |
| finished = wizard.invokeWizard(false); |
| } finally { |
| Containers.forUninstall().removeAll(); |
| Containers.forDisable().removeAll(); |
| Containers.forEnable().removeAll(); |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| protected boolean isEnabled (Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| Unit.Installed i = (Unit.Installed)u; |
| if (i.getRelevantElement ().isEnabled ()) { |
| retval = Unit.Installed.isOperationAllowed (u.updateUnit, u.getRelevantElement (), Containers.forDisable ()); |
| } |
| } |
| return retval; |
| } |
| protected String getContextName (Unit u) { |
| return getActionName (); |
| } |
| } |
| |
| private class ActivateRowAction extends RowTabAction { |
| public ActivateRowAction() { |
| super("UnitTab_ActivateRowAction", "EnableDisable"); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| Unit.Installed i = (Unit.Installed) u; |
| if (! i.getRelevantElement().isEnabled()) { |
| retval = Unit.Installed.isOperationAllowed(u.updateUnit, u.getRelevantElement(), Containers.forEnable()); |
| } |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forEnable().removeAll(); |
| Containers.forEnable().add(u.updateUnit, u.getRelevantElement()); |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| boolean finished = false; |
| try { |
| if (Containers.forEnable().listAll().size() > 0) { |
| finished = wizard.invokeWizard(true); |
| } |
| } finally { |
| Containers.forUninstall().removeAll(); |
| Containers.forDisable().removeAll(); |
| Containers.forEnable().removeAll(); |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class DeactivateRowAction extends RowTabAction { |
| public DeactivateRowAction() { |
| super("UnitTab_DeactivateRowAction", "EnableDisable"); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| Unit.Installed i = (Unit.Installed) u; |
| if (i.getRelevantElement().isEnabled()) { |
| retval = Unit.Installed.isOperationAllowed(u.updateUnit, u.getRelevantElement(), Containers.forDisable()); |
| } |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forDisable().removeAll(); |
| Containers.forDisable().add(u.updateUnit, u.getRelevantElement()); |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| boolean finished = false; |
| try { |
| if (Containers.forDisable().listAll().size() > 0) { |
| finished = wizard.invokeWizard(false); |
| } |
| } finally { |
| Containers.forUninstall().removeAll(); |
| Containers.forDisable().removeAll(); |
| Containers.forEnable().removeAll(); |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class UninstallRowAction extends RowTabAction { |
| public UninstallRowAction() { |
| super("UnitTab_UninstallRowAction", "EnableDisable"); |
| } |
| |
| @Override |
| protected boolean isEnabled(Unit u) { |
| boolean retval = false; |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| retval = ((Unit.Installed)u).isUninstallAllowed(); |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl(Unit u) { |
| final int row = getSelectedRow (); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| Containers.forUninstall().removeAll(); |
| Containers.forUninstall().add(u.updateUnit, u.getRelevantElement()); |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| boolean finished = false; |
| try { |
| if (Containers.forUninstall().listAll().size() > 0) { |
| finished = wizard.invokeWizard(); |
| } |
| } finally { |
| Containers.forUninstall().removeAll(); |
| Containers.forDisable().removeAll(); |
| Containers.forEnable().removeAll(); |
| fireUpdataUnitChange(); |
| if (!finished) { |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| } |
| restoreSelectedRow(row); |
| refreshState(); |
| focusTable(); |
| } |
| } |
| |
| @Override |
| protected String getContextName(Unit u) { |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| return getActionName() + " \"" + u.getDisplayName() + "\""; //NOI18N |
| } |
| return getActionName(); |
| } |
| |
| } |
| |
| private class DeactivateCategoryAction extends RowTabAction { |
| public DeactivateCategoryAction () { |
| super ("UnitTab_DeactivateCategoryAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_G, KeyEvent.CTRL_DOWN_MASK),*/ "EnableDisable"); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| boolean retval = false; |
| |
| String category = uu.getCategoryName(); |
| List<Unit> units = model.getUnits(); |
| for (Unit u : units) { |
| if ((u != null) && (u instanceof Unit.Installed) && category.equals(u.getCategoryName())) { |
| Unit.Installed installed = (Unit.Installed) u; |
| if (installed.getRelevantElement().isEnabled()) { |
| retval = Unit.Installed.isOperationAllowed(installed.updateUnit, installed.getRelevantElement(), Containers.forDisable()); |
| } |
| } |
| } |
| return retval; |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| if ((u != null) && (u instanceof Unit.Installed)) { |
| return getActionName ()+ " \"" + u.getCategoryName () + "\"";//NOI18N |
| } |
| return getActionName (); |
| } |
| @Override |
| public void performerImpl (Unit uu) { |
| Unit.Installed unit = (Unit.Installed)uu; |
| final int row = getSelectedRow(); |
| |
| String category = unit.getCategoryName (); |
| int count = model.getRowCount (); |
| for (int i = 0; i < count; i++) { |
| Unit u = model.getUnitAtRow (i); |
| if ((u != null) && (u instanceof Unit.Installed) && category.equals (u.getCategoryName ())) { |
| Unit.Installed installed = (Unit.Installed)u; |
| if (installed.getRelevantElement().isEnabled() && !installed.updateUnit.isPending()) { |
| OperationInfo info = Containers.forDisable ().add (installed.updateUnit, installed.getRelevantElement ()); |
| // Issue #169640 |
| // The relevant element can actually be present in forDisable container |
| // due to current Unit.Installed.setMarked() implementation as |
| // it operates on the the same ("global") Containers.forDisable() container. |
| // That is the reason for the commenting the following assertion originally presented |
| |
| //assert info != null; |
| } |
| } |
| } |
| |
| if (Containers.forDisable ().listAll ().size () > 0) { |
| UninstallUnitWizard wizard = new UninstallUnitWizard (); |
| wizard.invokeWizard (false); |
| Containers.forDisable ().removeAll (); |
| } |
| fireUpdataUnitChange (); |
| restoreSelectedRow(row); |
| focusTable (); |
| } |
| @Override |
| protected boolean isVisible (Unit u) { |
| if (u.getRelevantElement().getUpdateUnit().getType() == UpdateManager.TYPE.FEATURE) { |
| return false; |
| } |
| return isEnabled(); |
| } |
| } |
| |
| private class UncheckCategoryAction extends RowTabAction { |
| public UncheckCategoryAction () { |
| super ("UnitTab_UncheckCategoryAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_D, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK),*/ "Uncheck"); |
| } |
| @Override |
| protected boolean isEnabled (Unit u) { |
| boolean retval = false; |
| |
| String category = u.getCategoryName(); |
| List<Unit> units = model.getUnits(); |
| for (Unit uu : units) { |
| if (uu != null && category.equals(uu.getCategoryName()) && uu.isMarked()) { |
| retval = true; |
| break; |
| } |
| } |
| return retval; |
| } |
| |
| @Override |
| public void performerImpl (Unit u) { |
| String category = u.getCategoryName (); |
| final int row = getSelectedRow(); |
| |
| int count = model.getRowCount (); |
| for (int i = 0; i < count; i++) { |
| u = model.getUnitAtRow (i); |
| if (u != null && category.equals (u.getCategoryName ()) && u.isMarked () && u.canBeMarked ()) { |
| u.setMarked (false); |
| } |
| } |
| model.fireTableDataChanged (); |
| restoreSelectedRow(row); |
| focusTable(); |
| } |
| |
| @Override |
| protected boolean isVisible (Unit u) { |
| if (u.getRelevantElement().getUpdateUnit().getType() == UpdateManager.TYPE.FEATURE) { |
| return false; |
| } |
| return super.isVisible(u); |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName () + " \"" + u.getCategoryName ()+"\""; //NOI18N |
| } |
| } |
| |
| private void uncheckAll() { |
| Collection<Unit> markedUnits = model.getMarkedUnits(); |
| for (Unit u : markedUnits) { |
| if (u != null && u.isMarked() && u.canBeMarked()) { |
| u.setMarked(false); |
| } |
| } |
| model.fireTableDataChanged(); |
| } |
| |
| private class CheckAllAction extends RowTabAction { |
| public CheckAllAction () { |
| super ("UnitTab_CheckAllAction", KeyStroke.getKeyStroke (KeyEvent.VK_A, KeyEvent.CTRL_DOWN_MASK), "Check"); |
| } |
| |
| @Override |
| public void performerImpl (Unit uu) { |
| final int row = getSelectedRow(); |
| Collection<Unit> allUnits = model.getUnits(); |
| for (Unit u : allUnits) { |
| if (u != null && !u.isMarked () && u.canBeMarked ()) { |
| u.setMarked (true); |
| } |
| } |
| model.fireTableDataChanged (); |
| restoreSelectedRow(row); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| return true; |
| } |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName (); |
| } |
| } |
| |
| private class UncheckAllAction extends RowTabAction { |
| public UncheckAllAction () { |
| super ("UnitTab_UncheckAllAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), */"Uncheck"); |
| } |
| @Override |
| public void performerImpl (Unit uu) { |
| final int row = getSelectedRow(); |
| uncheckAll(); |
| model.fireTableDataChanged (); |
| restoreSelectedRow(row); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| return true; |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName (); |
| } |
| } |
| |
| private class MoreAction extends RowTabAction { |
| public MoreAction () { |
| super ("UnitTab_MoreAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), */"Expand");//NOI18N |
| } |
| @Override |
| public void performerImpl (Unit uu) { |
| try { |
| setWaitingState(true); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| model.setExpanded(true); |
| fireUpdataUnitChange (); |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| focusTable(); |
| } finally { |
| setWaitingState(false); |
| } |
| } |
| |
| @Override |
| protected boolean isVisible(Unit u) { |
| return isEnabled(u); |
| } |
| |
| @Override |
| protected boolean isVisible(int row) { |
| return !model.isExpansionControlAtRow(row) && isEnabled(row); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| return uu != null && model.isExpansionControlPresent() && model.isCollapsed(); |
| } |
| |
| @Override |
| protected boolean isEnabled (int row) { |
| return model.isExpansionControlPresent() && model.isCollapsed(); |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName(); |
| } |
| } |
| |
| private class LessAction extends RowTabAction { |
| public LessAction () { |
| super ("UnitTab_LessAction", /*KeyStroke.getKeyStroke (KeyEvent.VK_N, KeyEvent.CTRL_DOWN_MASK | KeyEvent.SHIFT_DOWN_MASK), */"Expand");//NOI18N |
| } |
| @Override |
| public void performerImpl (Unit uu) { |
| try { |
| setWaitingState(true); |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState(model.getUnits()); |
| model.setExpanded(false); |
| fireUpdataUnitChange(); |
| UnitCategoryTableModel.restoreState(model.getUnits(), state, model.isMarkedAsDefault()); |
| focusTable(); |
| } finally { |
| setWaitingState(false); |
| } |
| } |
| |
| @Override |
| protected boolean isVisible(Unit u) { |
| return isEnabled(u); |
| } |
| |
| @Override |
| protected boolean isVisible(int row) { |
| return !model.isExpansionControlAtRow(row) && isEnabled(row); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| return uu != null && model.isExpansionControlPresent() && model.isExpanded(); |
| } |
| |
| @Override |
| protected boolean isEnabled (int row) { |
| return model.isExpansionControlPresent() && model.isExpanded(); |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName(); |
| } |
| } |
| |
| |
| private class ReloadAction extends TabAction { |
| Task reloadTask = null; |
| @SuppressWarnings("OverridableMethodCallInConstructor") |
| public ReloadAction (String nameKey) { |
| super (nameKey, KeyStroke.getKeyStroke (KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK), null); |
| String tooltip = NbBundle.getMessage (UnitTab.class, "UnitTab_Tooltip_RefreshAction");//NOI18N |
| putValue (TOOL_TIP_TEXT_KEY, tooltip); |
| setEnabled (false); |
| } |
| |
| @Override |
| public void performerImpl () { |
| setEnabled (false); |
| reloadTask = reloadTask (true); |
| } |
| |
| @Override |
| public void setEnabled (boolean enabled) { |
| super.setEnabled (enabled); |
| super.firePropertyChange ("enabled", !isEnabled (), isEnabled ()); |
| } |
| } |
| |
| private class AddLocallyDownloadedAction extends TabAction { |
| public AddLocallyDownloadedAction () { |
| super ("UnitTab_bAddLocallyDownloads_Name", null); |
| topButton.getAccessibleContext ().setAccessibleName (NbBundle.getMessage(UnitTab.class, "UnitTab_bAddLocallyDownloads_ACN")); // NOI18N |
| topButton.getAccessibleContext ().setAccessibleDescription (NbBundle.getMessage(UnitTab.class, "UnitTab_bAddLocallyDownloads_ACD")); // NOI18N |
| String tooltip = NbBundle.getMessage (UnitTab.class, "UnitTab_Tooltip_AddAction_LOCAL");//NOI18N |
| putValue (TOOL_TIP_TEXT_KEY, tooltip); |
| } |
| |
| @Override |
| public void performerImpl () { |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| if (getLocalDownloadSupport ().chooseNbmFiles ()) { |
| updateTab (state); |
| } |
| } |
| |
| @Override |
| public void setEnabled (boolean enabled) { |
| super.setEnabled (enabled); |
| super.firePropertyChange ("enabled", !isEnabled (), isEnabled ()); |
| } |
| } |
| |
| private class RemoveLocallyDownloadedAction extends RowTabAction { |
| public RemoveLocallyDownloadedAction () { |
| super ("UnitTab_RemoveLocallyDownloadedAction", null); |
| String tooltip = NbBundle.getMessage (UnitTab.class, "UnitTab_Tooltip_RemoveAction_LOCAL");//NOI18N |
| putValue (TOOL_TIP_TEXT_KEY, tooltip); |
| } |
| |
| @Override |
| protected boolean isEnabled (Unit uu) { |
| return uu != null && (model.getType ().equals (UnitCategoryTableModel.Type.LOCAL)); |
| } |
| |
| @Override |
| public boolean isEnabled () { |
| if (super.isEnabled ()) { |
| return table.getSelectedRow () > -1; |
| } else { |
| return false; |
| } |
| } |
| |
| @Override |
| public void setEnabled (boolean enabled) { |
| super.setEnabled (enabled); |
| super.firePropertyChange ("enabled", !isEnabled (), isEnabled ()); |
| } |
| @Override |
| public void performerImpl (final Unit unit) { |
| final Runnable removeUpdates = new Runnable (){ |
| @Override |
| public void run () { |
| final Map<String, Boolean> state = UnitCategoryTableModel.captureState (model.getUnits ()); |
| try { |
| if (unit.isMarked ()) { |
| //this removes it from container |
| unit.setMarked (false); |
| } |
| getLocalDownloadSupport ().remove (unit.updateUnit); |
| getLocalDownloadSupport ().getUpdateUnits (); |
| } finally { |
| SwingUtilities.invokeLater (new Runnable () { |
| @Override |
| public void run () { |
| fireUpdataUnitChange(); |
| UnitCategoryTableModel.restoreState (model.getUnits (), state, model.isMarkedAsDefault ()); |
| refreshState (); |
| setWaitingState (false); |
| } |
| }); |
| } |
| } |
| }; |
| setWaitingState (true); |
| Utilities.startAsWorkerThread (removeUpdates, 250); |
| } |
| |
| @Override |
| protected String getContextName (Unit u) { |
| return getActionName ();//NOI18N |
| } |
| |
| @Override |
| protected boolean isVisible (Unit u) { |
| return false; |
| } |
| } |
| private class EnableRenderer extends DefaultTableCellRenderer { |
| @Override |
| public Component getTableCellRendererComponent ( |
| JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
| JLabel renderComponent = (JLabel)super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column); |
| |
| if (value instanceof Boolean) { |
| Unit u = model.getUnitAtRow(table.convertRowIndexToModel(row)); |
| if (u != null && u.getRelevantElement ().getUpdateUnit ().isPending ()) { |
| renderComponent.setIcon (ImageUtilities.loadImageIcon("org/netbeans/modules/autoupdate/ui/resources/restart.png", false)); // NOI18N |
| } else { |
| Boolean state = (Boolean)value; |
| if (state.booleanValue()) { |
| renderComponent.setIcon(ImageUtilities.loadImageIcon("org/netbeans/modules/autoupdate/ui/resources/active.png", false)); // NOI18N |
| } else { |
| renderComponent.setIcon(ImageUtilities.loadImageIcon("org/netbeans/modules/autoupdate/ui/resources/inactive.png", false)); // NOI18N |
| } |
| } |
| renderComponent.setText (""); |
| renderComponent.setHorizontalAlignment (SwingConstants.CENTER); |
| |
| } |
| Component retval = renderComponent; |
| return retval; |
| } |
| } |
| |
| class SourceCategoryRenderer extends DefaultTableCellRenderer { |
| @Override |
| public Component getTableCellRendererComponent ( |
| JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { |
| JLabel renderComponent = (JLabel)super.getTableCellRendererComponent (table, value, isSelected, hasFocus, row, column); |
| |
| if (value instanceof Image) { |
| Unit u = model.getUnitAtRow(table.convertRowIndexToModel(row)); |
| if (u instanceof Unit.Available) { |
| Unit.Available a = (Unit.Available)u; |
| renderComponent.setIcon(ImageUtilities.image2Icon(a.getSourceIcon())); |
| renderComponent.setText (""); |
| renderComponent.setHorizontalAlignment (SwingConstants.CENTER); |
| } |
| |
| } |
| Component retval = renderComponent; |
| return retval; |
| } |
| } |
| // Variables declaration - do not modify//GEN-BEGIN:variables |
| private javax.swing.JButton bDeactivate; |
| private javax.swing.JButton bTabAction; |
| private javax.swing.JButton bUninstall; |
| private javax.swing.JCheckBox detailView; |
| private javax.swing.JLabel lSearch; |
| private javax.swing.JLabel lSelectionInfo; |
| private javax.swing.JLabel lWarning; |
| private javax.swing.JSplitPane spTab; |
| private javax.swing.JTextField tfSearch; |
| private javax.swing.JButton topButton; |
| // End of variables declaration//GEN-END:variables |
| |
| } |