/*
* CloseDialog.java - Close all buffers dialog
* :tabSize=4:indentSize=4:noTabs=false:
* :folding=explicit:collapseFolds=1:
*
* Copyright (C) 1999, 2000 Slava Pestov
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.gjt.sp.jedit.gui;
//{{{ Imports
import java.util.Collection;
import java.util.Arrays;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import org.gjt.sp.jedit.bufferio.BufferIORequest;
import org.gjt.sp.jedit.io.*;
import org.gjt.sp.jedit.*;
import org.gjt.sp.util.GenericGUIUtilities;
import org.gjt.sp.util.Log;
import org.gjt.sp.util.TaskManager;
//}}}
/** Close all buffers dialog
* @author Slava Pestov
*/
public class CloseDialog extends EnhancedDialog
{
//{{{ CloseDialog constructor
public CloseDialog(View view)
{
this(view, Arrays.asList(jEdit.getBuffers()));
}
public CloseDialog(View view, Collection<Buffer> buffers)
{
super(view,jEdit.getProperty("close.title"),true);
this.view = view;
JPanel content = new JPanel(new BorderLayout(12,12));
content.setBorder(new EmptyBorder(12,12,12,12));
setContentPane(content);
Box iconBox = new Box(BoxLayout.Y_AXIS);
iconBox.add(new JLabel(UIManager.getIcon("OptionPane.warningIcon")));
iconBox.add(Box.createGlue());
content.add(BorderLayout.WEST,iconBox);
JPanel centerPanel = new JPanel(new BorderLayout());
JLabel label = new JLabel(jEdit.getProperty("close.caption"));
label.setBorder(new EmptyBorder(0,0,6,0));
centerPanel.add(BorderLayout.NORTH,label);
bufferList = new JList<String>(bufferModel = new DefaultListModel<String>());
bufferList.setVisibleRowCount(10);
bufferList.addListSelectionListener(new ListHandler());
for(Buffer buffer: buffers)
{
if(buffer.isDirty())
bufferModel.addElement(buffer.getPath());
}
centerPanel.add(BorderLayout.CENTER,new JScrollPane(bufferList));
content.add(BorderLayout.CENTER,centerPanel);
ActionHandler actionListener = new ActionHandler();
Box buttons = new Box(BoxLayout.X_AXIS);
buttons.add(Box.createGlue());
buttons.add(selectAll = new JButton(jEdit.getProperty("close.selectAll")));
selectAll.setMnemonic(jEdit.getProperty("close.selectAll.mnemonic").charAt(0));
selectAll.addActionListener(actionListener);
buttons.add(Box.createHorizontalStrut(6));
buttons.add(save = new JButton(jEdit.getProperty("close.save")));
save.setMnemonic(jEdit.getProperty("close.save.mnemonic").charAt(0));
save.addActionListener(actionListener);
buttons.add(Box.createHorizontalStrut(6));
buttons.add(discard = new JButton(jEdit.getProperty("close.discard")));
discard.setMnemonic(jEdit.getProperty("close.discard.mnemonic").charAt(0));
discard.addActionListener(actionListener);
buttons.add(Box.createHorizontalStrut(6));
buttons.add(cancel = new JButton(jEdit.getProperty("common.cancel")));
cancel.addActionListener(actionListener);
buttons.add(Box.createGlue());
bufferList.setSelectedIndex(0);
content.add(BorderLayout.SOUTH,buttons);
content.getRootPane().setDefaultButton(cancel);
GenericGUIUtilities.requestFocus(this,bufferList);
pack();
setLocationRelativeTo(view);
setVisible(true);
} //}}}
//{{{ isOK() method
public boolean isOK()
{
return ok;
} //}}}
//{{{ ok() method
@Override
public void ok()
{
// do nothing
} //}}}
//{{{ cancel() method
@Override
public void cancel()
{
dispose();
} //}}}
//{{{ Private members
private final View view;
private final JList<String> bufferList;
private final DefaultListModel<String> bufferModel;
private final JButton selectAll;
private final JButton save;
private final JButton discard;
private final JButton cancel;
private boolean ok; // only set if all buffers saved/closed
boolean selectAllFlag;
private void updateButtons()
{
int index = bufferList.getSelectedIndex();
save.getModel().setEnabled(index != -1);
discard.getModel().setEnabled(index != -1);
} //}}}
//{{{ ActionHandler class
private class ActionHandler implements ActionListener
{
public void actionPerformed(ActionEvent evt)
{
Object source = evt.getSource();
if(source == selectAll)
{
// I'm too tired to think of a better way
// to handle this right now.
try
{
selectAllFlag = true;
bufferList.setSelectionInterval(0,
bufferModel.getSize() - 1);
}
finally
{
selectAllFlag = false;
}
bufferList.requestFocus();
}
else if(source == save)
{
java.util.List<String> paths = bufferList.getSelectedValuesList();
for (String path : paths)
{
Buffer buffer = jEdit.getBuffer(path);
if (!buffer.save(view, null, true, true)) return;
TaskManager.instance.waitForIoTasks();
if (buffer.getBooleanProperty(BufferIORequest.ERROR_OCCURRED)) return;
jEdit._closeBuffer(view, buffer);
bufferModel.removeElement(path);
}
if(bufferModel.getSize() == 0)
{
ok = true;
dispose();
}
else
{
bufferList.setSelectedIndex(0);
bufferList.requestFocus();
}
}
else if(source == discard)
{
java.util.List<String> paths = bufferList.getSelectedValuesList();
for (String path : paths)
{
Buffer buffer = jEdit.getBuffer(path);
jEdit._closeBuffer(view, buffer);
bufferModel.removeElement(path);
}
if(bufferModel.getSize() == 0)
{
ok = true;
dispose();
}
else
{
bufferList.setSelectedIndex(0);
bufferList.requestFocus();
}
}
else if(source == cancel)
cancel();
}
} //}}}
//{{{ ListHandler class
private class ListHandler implements ListSelectionListener
{
public void valueChanged(ListSelectionEvent evt)
{
if(selectAllFlag)
return;
int index = bufferList.getSelectedIndex();
if(index != -1)
{
String path = (String) bufferModel.getElementAt(index);
Buffer buffer = jEdit.getBuffer(path);
if (buffer == null)
{
// it seems this buffer was already closed
Log.log(Log.DEBUG, this, "Buffer " + path + " is already closed");
bufferModel.removeElementAt(index);
}
else
{
view.showBuffer(buffer);
}
}
updateButtons();
}
} //}}}
}