1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 /*
  23  * Copyright 1998-2002 by Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 package com.sun.dhcpmgr.client;
  27 
  28 import javax.swing.*;
  29 import javax.swing.border.*;
  30 import javax.swing.event.*;
  31 import javax.swing.table.*;
  32 
  33 import java.awt.*;
  34 import java.awt.event.*;
  35 import java.text.*;
  36 import java.util.*;
  37 
  38 import com.sun.dhcpmgr.server.*;
  39 import com.sun.dhcpmgr.data.*;
  40 import com.sun.dhcpmgr.ui.*;
  41 import com.sun.dhcpmgr.bridge.BridgeException;
  42 
  43 /**
  44  * A dialog to remove one or more networks from the DHCP configuration.
  45  */
  46 public class DeleteNetworksDialog extends MultipleOperationDialog {
  47 
  48     class NetworkListModel extends AbstractListModel {
  49         private Vector networks;
  50 
  51         public NetworkListModel() {
  52             networks = new Vector();
  53         }
  54 
  55         public void setNetworks(Network [] nets) {
  56             networks.removeAllElements();
  57             addNetworks(nets);
  58         }
  59 
  60         public void addNetworks(Object [] nets) {
  61             if (nets != null) {
  62                 for (int i = 0; i < nets.length; ++i) {
  63                     networks.addElement((Network)nets[i]);
  64                 }
  65             }
  66             fireContentsChanged(this, 0, networks.size()-1);
  67         }
  68 
  69         public void deleteNetworks(Object [] nets) {
  70             for (int i = 0; i < nets.length; ++i) {
  71                 networks.removeElement((Network)nets[i]);
  72             }
  73             fireContentsChanged(this, 0, networks.size()-1);
  74         }
  75 
  76         public Object getElementAt(int index) {
  77             return networks.elementAt(index);
  78         }
  79 
  80         public int getSize() {
  81             return networks.size();
  82         }
  83     }
  84 
  85     private JList keepNets, deleteNets;
  86     private LeftButton leftButton;
  87     private RightButton rightButton;
  88 
  89     public DeleteNetworksDialog(Frame f) {
  90         // We want a reset button
  91         super(f, true);
  92     }
  93 
  94     public String getTitle() {
  95         return ResourceStrings.getString("delete_networks_title");
  96     }
  97 
  98     protected JPanel getMainPanel() {
  99         JPanel mainPanel = new JPanel(new BorderLayout());
 100         mainPanel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
 101 
 102         JPanel netBox = new JPanel(new ProportionalLayout());
 103         JPanel panel = new JPanel(new BorderLayout(5, 5));
 104 
 105         Mnemonic mnKeep =
 106             new Mnemonic(ResourceStrings.getString("delete_networks_keep"));
 107         JLabel delNetsLbl = new JLabel(mnKeep.getString());
 108         panel.add(delNetsLbl, BorderLayout.NORTH);
 109         delNetsLbl.setToolTipText(mnKeep.getString());
 110         keepNets = new JList(new NetworkListModel());
 111         delNetsLbl.setLabelFor(keepNets);
 112         delNetsLbl.setDisplayedMnemonic(mnKeep.getMnemonic());
 113 
 114         keepNets.setSelectionMode(
 115             ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 116         JScrollPane scrollPane = new JScrollPane(keepNets);
 117         panel.add(scrollPane, BorderLayout.CENTER);
 118         netBox.add("2", panel);
 119 
 120         panel = new JPanel(new VerticalButtonLayout());
 121         leftButton = new LeftButton();
 122         rightButton = new RightButton();
 123         rightButton.setEnabled(false);
 124         leftButton.setEnabled(false);
 125         panel.add(rightButton);
 126         panel.add(leftButton);
 127         netBox.add("1", panel);
 128 
 129         panel = new JPanel(new BorderLayout(5, 5));
 130 
 131         Mnemonic mnDel =
 132             new Mnemonic(ResourceStrings.getString("delete_networks_delete"));
 133         JLabel delNets = new JLabel(mnDel.getString());
 134         panel.add(delNets, BorderLayout.NORTH);
 135 
 136         deleteNets = new JList(new NetworkListModel());
 137         deleteNets.setSelectionMode(
 138             ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
 139 
 140         delNets.setLabelFor(deleteNets);
 141         delNets.setToolTipText(mnDel.getString());
 142         delNets.setDisplayedMnemonic(mnDel.getMnemonic());
 143 
 144         scrollPane = new JScrollPane(deleteNets);
 145         panel.add(scrollPane, BorderLayout.CENTER);
 146         netBox.add("2", panel);
 147 
 148         mainPanel.add(netBox, BorderLayout.CENTER);
 149 
 150         // Handle enable and disable of buttons based on selection state
 151         keepNets.addListSelectionListener(new ListSelectionListener() {
 152             public void valueChanged(ListSelectionEvent e) {
 153                 rightButton.setEnabled(!keepNets.isSelectionEmpty());
 154                 if (!keepNets.isSelectionEmpty()) {
 155                     deleteNets.clearSelection();
 156                 }
 157             }
 158         });
 159 
 160         deleteNets.addListSelectionListener(new ListSelectionListener() {
 161             public void valueChanged(ListSelectionEvent e) {
 162                 leftButton.setEnabled(!deleteNets.isSelectionEmpty());
 163                 if (!deleteNets.isSelectionEmpty()) {
 164                     keepNets.clearSelection();
 165                 }
 166             }
 167         });
 168 
 169         // Handle button presses
 170         rightButton.addActionListener(new ActionListener() {
 171             public void actionPerformed(ActionEvent e) {
 172                 Object [] nets = keepNets.getSelectedValues();
 173                 ((NetworkListModel)deleteNets.getModel()).addNetworks(nets);
 174                 ((NetworkListModel)keepNets.getModel()).deleteNetworks(nets);
 175                 if (deleteNets.getModel().getSize() != 0) {
 176                     buttonPanel.setOkEnabled(true);
 177                 }
 178                 /*
 179                  * Clear the selection; prevents exceptions from selection
 180                  * having been deleted
 181                  */
 182                 keepNets.clearSelection();
 183             }
 184         });
 185 
 186         leftButton.addActionListener(new ActionListener() {
 187             public void actionPerformed(ActionEvent e) {
 188                 Object [] nets = deleteNets.getSelectedValues();
 189                 ((NetworkListModel)keepNets.getModel()).addNetworks(nets);
 190                 ((NetworkListModel)deleteNets.getModel()).deleteNetworks(nets);
 191                 /*
 192                  * Clear the selection; prevents exceptions from selection
 193                  * having been deleted
 194                  */
 195                 deleteNets.clearSelection();
 196                 if (deleteNets.getModel().getSize() == 0) {
 197                     buttonPanel.setOkEnabled(false);
 198                 }
 199             }
 200         });
 201 
 202         doReset();
 203 
 204         return mainPanel;
 205     }
 206 
 207     protected void doReset() {
 208         try {
 209             buttonPanel.setOkEnabled(false);
 210             ((NetworkListModel)deleteNets.getModel()).setNetworks(null);
 211             ((NetworkListModel)keepNets.getModel()).setNetworks(
 212                 DataManager.get().getNetworks(false));
 213         } catch (Throwable e) {
 214             e.printStackTrace();
 215             // Do nothing
 216         }
 217     }
 218 
 219     protected String getProgressMessage() {
 220         return ResourceStrings.getString("delete_networks_progress");
 221     }
 222 
 223     protected int getProgressLength() {
 224         return deleteNets.getModel().getSize();
 225     }
 226 
 227     protected String getErrorHeading() {
 228         return ResourceStrings.getString("network_column");
 229     }
 230 
 231     protected Thread getOperationThread() {
 232         return new Thread() {
 233             public void run() {
 234                 NetworkListModel model =
 235                     (NetworkListModel)deleteNets.getModel();
 236                 for (int i = 0; i < model.getSize(); ++i) {
 237                     Network net = (Network)model.getElementAt(i);
 238                     try {
 239                         DataManager.get().getDhcpNetMgr().deleteNetwork(
 240                             net.toString(), true);
 241                         updateProgress(i+1, net.toString());
 242                     } catch (InterruptedException e) {
 243                         // User asked us to stop
 244                         closeDialog();
 245                         return;
 246                     } catch (Throwable e) {
 247                         addError(net.toString(), e.getMessage());
 248                     }
 249                 }
 250                 if (errorsOccurred()) {
 251                     displayErrors(
 252                         ResourceStrings.getString("delete_networks_error"));
 253                 }
 254                 closeDialog();
 255             }
 256         };
 257     }
 258 
 259     protected String getHelpKey() {
 260         return "delete_network";
 261     }
 262 
 263     protected void fireActionPerformed() {
 264         fireActionPerformed(this, DialogActions.OK);
 265     }
 266 }