package org.openjump.core.ui.plugin.file.open;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.beans.PropertyVetoException;
import java.lang.ref.WeakReference;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JDesktopPane;
import javax.swing.JInternalFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.SpringLayout;
import javax.swing.SwingUtilities;
import org.openjump.swing.listener.InvokeMethodActionListener;
import org.openjump.swing.listener.InvokeMethodListSelectionListener;
import org.openjump.swing.util.SpringUtilities;
import com.vividsolutions.jump.workbench.JUMPWorkbench;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.ui.TaskFrame;
import com.vividsolutions.jump.workbench.ui.WorkbenchFrame;
import com.vividsolutions.jump.workbench.ui.wizard.AbstractWizardPanel;
public class ChooseProjectPanel extends AbstractWizardPanel {
private static final long serialVersionUID = -1681453503884354145L;
private WorkbenchContext workbenchContext;
private JList projectList;
private JRadioButton newButton;
private JRadioButton existingButton;
private WeakReference<TaskFrame> selectedTaskFrame;
public ChooseProjectPanel(final WorkbenchContext workbenchContext,
final String nextId) {
this.workbenchContext = workbenchContext;
setNextID(nextId);
setLayout(new BorderLayout());
JPanel view = new JPanel(new SpringLayout());
newButton = new JRadioButton("New Project");
newButton.setSelected(true);
view.add(newButton);
existingButton = new JRadioButton("Existing Project");
view.add(existingButton);
ButtonGroup group = new ButtonGroup();
group.add(newButton);
group.add(existingButton);
projectList = new JList(new DefaultListModel());
JScrollPane listScroller = new JScrollPane(projectList);
listScroller.setPreferredSize(new Dimension(300, 150));
view.add(listScroller);
SpringUtilities.makeCompactGrid(view, 3, 1, 5, 5, 5, 5);
InvokeMethodActionListener actionListener = new InvokeMethodActionListener(
this, "updateButtons");
newButton.addActionListener(actionListener);
existingButton.addActionListener(actionListener);
projectList.addListSelectionListener(new InvokeMethodListSelectionListener(
this, "listSelected", true));
add(new JScrollPane(view), BorderLayout.CENTER);
}
public void enteredFromLeft(Map data) {
super.enteredFromLeft(data);
DefaultListModel model = (DefaultListModel)projectList.getModel();
projectList.setCellRenderer(new DefaultListCellRenderer() {
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
setText(((TaskFrame)value).getTask().getName());
return this;
}
});
model.removeAllElements();
JUMPWorkbench workbench = workbenchContext.getWorkbench();
WorkbenchFrame workbenchFrame = workbench.getFrame();
JDesktopPane desktopPane = workbenchFrame.getDesktopPane();
for (JInternalFrame frame : desktopPane.getAllFrames()) {
if (frame instanceof TaskFrame) {
TaskFrame taskFrame = (TaskFrame)frame;
model.addElement(taskFrame);
}
}
}
public void exitingToRight() throws Exception {
TaskFrame taskFrame = (TaskFrame)projectList.getSelectedValue();
if (taskFrame != null) {
selectedTaskFrame = new WeakReference<TaskFrame>(taskFrame);
} else {
selectedTaskFrame = null;
}
DefaultListModel model = (DefaultListModel)projectList.getModel();
model.removeAllElements();
}
public boolean hasActiveTaskFrame() {
JUMPWorkbench workbench = workbenchContext.getWorkbench();
WorkbenchFrame workbenchFrame = workbench.getFrame();
JInternalFrame activeFrame = workbenchFrame.getActiveInternalFrame();
return activeFrame instanceof TaskFrame && !activeFrame.isIcon();
}
public boolean hasTaskFrames() {
JUMPWorkbench workbench = workbenchContext.getWorkbench();
WorkbenchFrame workbenchFrame = workbench.getFrame();
JDesktopPane desktopPane = workbenchFrame.getDesktopPane();
for (JInternalFrame frame : desktopPane.getAllFrames()) {
if (frame instanceof TaskFrame) {
return true;
}
}
return false;
}
public void setNextID(String nextId) {
super.setNextID(nextId);
}
public void updateButtons() {
if (newButton.isSelected()) {
projectList.getSelectionModel().clearSelection();
} else {
if (projectList.getSelectedIndex() == -1) {
projectList.setSelectedIndex(0);
}
}
}
public void listSelected() {
if (projectList.getSelectedIndex() == -1) {
newButton.setSelected(true);
} else {
existingButton.setSelected(true);
}
}
public void activateSelectedProject() {
if (!hasActiveTaskFrame()) {
JUMPWorkbench workbench = workbenchContext.getWorkbench();
final WorkbenchFrame frame = workbench.getFrame();
if (selectedTaskFrame == null) {
frame.addTaskFrame();
} else {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
TaskFrame taskFrame = selectedTaskFrame.get();
try {
taskFrame.setSelected(true);
} catch (PropertyVetoException e) {
}
if (taskFrame.isIcon()) {
try {
taskFrame.setIcon(false);
} catch (PropertyVetoException e) {
}
}
}
});
}
}
}
}