|
What this is
Other links
The source code/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is NetBeans. The Initial Developer of the Original * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun * Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.project.ui; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dialog; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.BeanInfo; import java.io.IOException; import java.util.HashSet; import java.util.Iterator; import java.util.ResourceBundle; import java.util.Set; import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.openide.DialogDescriptor; import org.openide.DialogDisplayer; import org.openide.ErrorManager; import org.openide.NotifyDescriptor; import org.openide.cookies.EditorCookie; import org.openide.cookies.SaveCookie; import org.openide.loaders.DataObject; import org.openide.nodes.Node; import org.openide.util.NbBundle; // XXX This code is stolen from core/ExitDialog. /** Dialog which lets the user select which open files to close. * * @author Ian Formanek, Petr Hrebejk */ final public class ExitDialog extends JPanel implements ActionListener { private static Object[] exitOptions; /** The dialog */ private static Dialog exitDialog; /** Result of the dialog */ private static boolean result = false; JList list; DefaultListModel listModel; /** Constructs new dlg for unsaved files in filesystems marked * for unmount. */ private ExitDialog (Set/*DataObject*/ openedFiles) { setLayout (new BorderLayout ()); listModel = new DefaultListModel(); Set set = getModifiedFiles (openedFiles); if (!set.isEmpty ()) { Iterator iter = set.iterator (); while (iter.hasNext ()) { DataObject obj = (DataObject) iter.next (); listModel.addElement(obj); } draw (); } } /** Constructs rest of dialog. */ private void draw () { list = new JList(listModel); list.setBorder(new EmptyBorder(2, 2, 2, 2)); list.addListSelectionListener (new ListSelectionListener () { public void valueChanged (ListSelectionEvent evt) { updateSaveButton (); } } ); // bugfix 37941, select first item in list if (!listModel.isEmpty ()) { list.setSelectedIndex (0); } else { updateSaveButton (); } JScrollPane scroll = new JScrollPane (list); scroll.setBorder (new CompoundBorder (new EmptyBorder (12, 12, 11, 0), scroll.getBorder ())); add(scroll, BorderLayout.CENTER); list.setCellRenderer(new ExitDlgListCellRenderer()); list.getAccessibleContext().setAccessibleName((NbBundle.getBundle(ExitDialog.class)).getString("ACSN_ListOfChangedFiles")); list.getAccessibleContext().setAccessibleDescription((NbBundle.getBundle(ExitDialog.class)).getString("ACSD_ListOfChangedFiles")); this.getAccessibleContext().setAccessibleDescription((NbBundle.getBundle(ExitDialog.class)).getString("ACSD_ExitDialog")); } private void updateSaveButton () { ((JButton)exitOptions [0]).setEnabled (list.getSelectedIndex () != -1); } /** @return preffered size */ public Dimension getPreferredSize() { Dimension prev = super.getPreferredSize(); return new Dimension(Math.max(300, prev.width), Math.max(150, prev.height)); } /** This method is called when is any of buttons pressed */ public void actionPerformed (final ActionEvent evt) { if (exitOptions[0].equals (evt.getSource ())) { save(false); } else if (exitOptions[1].equals (evt.getSource ())) { save(true); } else if (exitOptions[2].equals (evt.getSource ())) { theEnd(); } else if (NotifyDescriptor.CANCEL_OPTION.equals (evt.getSource ())) { exitDialog.setVisible (false); } } /** Save the files from the listbox * @param all true- all files, false - just selected */ private void save(boolean all) { Object array[] = ((all) ? listModel.toArray() : list.getSelectedValues()); int i, count = ((array == null) ? 0 : array.length); int index = 0; // index of last removed item for (i = 0; i < count; i++) { DataObject nextObject = (DataObject)array[i]; index = listModel.indexOf(nextObject); save(nextObject); } if (listModel.isEmpty()) theEnd(); else { // reset selection to new item at the same index if available if (index < 0) index = 0; else if (index > listModel.size() - 1) { index = listModel.size() - 1; } list.setSelectedIndex(index); } } /** Tries to save given data object using its save cookie. * Notifies user if excetions appear. */ private void save (DataObject dataObject) { try { SaveCookie sc = (SaveCookie)dataObject.getCookie(SaveCookie.class); if (sc != null) { sc.save(); } listModel.removeElement(dataObject); } catch (IOException exc) { ErrorManager em = ErrorManager.getDefault(); Throwable t = em.annotate( exc, NbBundle.getBundle(ExitDialog.class).getString("EXC_Save") ); em.notify(ErrorManager.EXCEPTION, t); } } /** Exit the IDE */ private void theEnd() { // XXX(-ttran) result must be set before calling setVisible(false) // because this will unblock the thread which called Dialog.show() for (int i = listModel.size() - 1; i >= 0; i--) { DataObject obj = (DataObject) listModel.getElementAt(i); obj.setModified(false); } result = true; exitDialog.setVisible (false); exitDialog.dispose(); } /** Opens the ExitDialog for unsaved files in filesystems marked * for unmount and blocks until it's closed. If dialog doesm't * exists it creates new one. Returns true if the IDE should be closed. */ public static boolean showDialog (Set/*DataObject*/ openedFiles) { return innerShowDialog (getModifiedFiles (openedFiles)); } private static Set getModifiedFiles (Set/*DataObject*/ openedFiles) { Set set = new HashSet (openedFiles.size ()); Iterator iter = openedFiles.iterator (); while (iter.hasNext()) { DataObject obj = (DataObject) iter.next (); EditorCookie ed = (EditorCookie)obj.getCookie (EditorCookie.class); if (ed != null && ed.isModified ()) { set.add (obj); } } return set; } /** Opens the ExitDialog for activated nodes or for * whole repository. */ private static boolean innerShowDialog (Set/*DataObject*/ openedFiles) { if (!openedFiles.isEmpty()) { // XXX(-ttran) caching this dialog is fatal. If the user // cancels the Exit action, modifies some more files and tries to // Exit again the list of modified DataObject's is not updated, // changes made by the user after the first aborted Exit will be // lost. exitDialog = null; if (exitDialog == null) { ResourceBundle bundle = NbBundle.getBundle(ExitDialog.class); JButton buttonSave = new JButton(); buttonSave.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_Save")); JButton buttonSaveAll = new JButton(); buttonSaveAll.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_SaveAll")); JButton buttonDiscardAll = new JButton(); buttonDiscardAll.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_DiscardAll")); buttonSave.setText (bundle.getString("CTL_Save")); buttonSave.setMnemonic (bundle.getString ("CTL_Save_MNM").charAt (0)); buttonSaveAll.setText (bundle.getString ("CTL_SaveAll")); buttonSaveAll.setMnemonic (bundle.getString ("CTL_SaveAll_MNM").charAt (0)); buttonDiscardAll.setText (bundle.getString ("CTL_DiscardAll")); buttonDiscardAll.setMnemonic (bundle.getString ("CTL_DiscardAll_MNM").charAt (0)); exitOptions = new Object[] { buttonSave, buttonSaveAll, buttonDiscardAll, }; ExitDialog exitComponent = null; exitComponent = new ExitDialog (openedFiles); DialogDescriptor exitDlgDescriptor = new DialogDescriptor ( exitComponent, // inside component bundle.getString("CTL_ExitTitle"), // title true, // modal exitOptions, // options NotifyDescriptor.CANCEL_OPTION, // initial value DialogDescriptor.RIGHT_ALIGN, // option align null, // no help exitComponent // Action Listener ); exitDlgDescriptor.setAdditionalOptions (new Object[] {NotifyDescriptor.CANCEL_OPTION}); exitDialog = DialogDisplayer.getDefault ().createDialog (exitDlgDescriptor); } result = false; exitDialog.show(); // Show the modal Save dialog return result; } else return true; } /** Renderer used in list box of exit dialog */ private class ExitDlgListCellRenderer extends JLabel implements ListCellRenderer { protected Border hasFocusBorder; protected Border noFocusBorder; public ExitDlgListCellRenderer() { this.setOpaque(true); this.setBorder(noFocusBorder); hasFocusBorder = new LineBorder(UIManager.getColor("List.focusCellHighlight")); // NOI18N noFocusBorder = new EmptyBorder(1, 1, 1, 1); } public Component getListCellRendererComponent (JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) // the list and the cell have the focus { final DataObject obj = (DataObject)value; if (!obj.isValid()) { // #17059: it might be invalid already. // #18886: but if so, remove it later, otherwise BasicListUI gets confused. SwingUtilities.invokeLater(new Runnable() { public void run() { listModel.removeElement(obj); } }); setText(""); return this; } Node node = obj.getNodeDelegate(); ImageIcon icon = new ImageIcon(node.getIcon(BeanInfo.ICON_COLOR_16x16)); super.setIcon(icon); setText(node.getDisplayName()); if (isSelected){ this.setBackground(UIManager.getColor("List.selectionBackground")); // NOI18N this.setForeground(UIManager.getColor("List.selectionForeground")); // NOI18N } else { this.setBackground(list.getBackground()); this.setForeground(list.getForeground()); } this.setBorder(cellHasFocus ? hasFocusBorder : noFocusBorder); return this; } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.