// PathVisio,
// a tool for data visualization and analysis using Biological Pathways
// Copyright 2006-2011 BiGCaT Bioinformatics
//
// Licensed 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.pathvisio.gui.dialogs;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
/**
* The basis for a dialog with ok / cancel buttons at the bottom
*
* The central panel can have arbitrarily complex contents
*/
public class OkCancelDialog extends JDialog implements ActionListener {
public static final String OK = "Ok";
public static final String CANCEL = "Cancel";
private String exitCode = CANCEL;
JButton setButton;
JPanel contentPanel;
/**
* Create a dialog with ok/cancel buttons. A custom content component can
* be set using {@link #setDialogComponent(Component)}.
* @param frame The frame to base the dialogs location on
* @param title The title of the dialog
* @param locationComp The component to base the dialogs location on
* @param modal Whether the dialog should be modal
* @param cancellable Whether to add a cancel button
*/
public OkCancelDialog(Frame frame, String title, Component locationComp, boolean modal, boolean cancellable) {
super(frame, title, modal);
contentPanel = new JPanel(new BorderLayout());
JButton cancelButton = new JButton(CANCEL);
cancelButton.addActionListener(this);
setButton = new JButton(OK);
setButton.setActionCommand(OK);
setButton.addActionListener(this);
getRootPane().setDefaultButton(setButton);
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
buttonPane.add(Box.createHorizontalGlue());
if(cancellable) {
buttonPane.add(cancelButton);
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
}
buttonPane.add(setButton);
contentPanel.add(buttonPane, BorderLayout.PAGE_END);
add(contentPanel);
pack();
setLocationRelativeTo(locationComp);
//Make buttons respond to pressing 'Enter'
UIManager.put("Button.defaultButtonFollowsFocus", Boolean.TRUE);
KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0);
contentPanel.registerKeyboardAction(this, CANCEL, esc,JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
}
public OkCancelDialog(Frame frame, String title, Component locationComp, boolean modal) {
this(frame, title, locationComp, modal, true);
}
/**
* Set the component that contains the dialog contents. Subclasses must
* call this method to set custom dialog contents.
* @param dialogComponent
*/
public final void setDialogComponent(Component dialogComponent) {
contentPanel.add(dialogComponent, BorderLayout.CENTER);
invalidate();
}
public String getExitCode() {
return exitCode;
}
protected void okPressed() {
setButton.requestFocus(); //Fix for bug #228
//Request focus to allow possible open celleditors
//in this dialog to apply the current value
exitCode = OK;
setVisible(false);
}
protected void cancelPressed() {
exitCode = CANCEL;
setVisible(false);
}
public void actionPerformed(ActionEvent e) {
if (OK.equals(e.getActionCommand())) {
okPressed();
}
if(CANCEL.equals(e.getActionCommand())) {
cancelPressed();
}
}
}