package uk.co.bytemark.vm.enigma.inquisition.gui.editor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JDialog; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableModel; import uk.co.bytemark.vm.enigma.inquisition.gui.screens.editor.AbstractDragAndDropQuestionEditorPanel; import uk.co.bytemark.vm.enigma.inquisition.questions.DragAndDropQuestion; import uk.co.bytemark.vm.enigma.inquisition.questions.DragAndDropRenderingHelper; public class DragAndDropQuestionEditorPanel extends AbstractDragAndDropQuestionEditorPanel implements IQuestionEditorPanel { private final DefaultTableModel tableModel; private final ListSelectionModel selectionModel; public DragAndDropQuestionEditorPanel( DragAndDropQuestion question ) { questionTextArea.setText( question.getQuestionText() ); questionTextArea.setCaretPosition( 0 ); explanationTextArea.setText( question.getExplanationText() ); explanationTextArea.setCaretPosition( 0 ); reuseFragmentsCheckBox.setSelected( question.canReuseFragments() ); tableModel = makeExtraFragmentsTableModel( question ); extraFragmentsTable.setModel( tableModel ); extraFragmentsTable.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); selectionModel = extraFragmentsTable.getSelectionModel(); previewQuestionButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { String questionTextHtml = DragAndDropRenderingHelper.getQuestionText( getQuestion(), false ); launchPreviewDialog( questionTextHtml ); } } ); previewExplanationButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { String explanationTextHtml = DragAndDropRenderingHelper.getExplanationText( getQuestion() ); launchPreviewDialog( explanationTextHtml ); } } ); deleteButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { int deleteIndex = selectionModel.getMinSelectionIndex(); tableModel.removeRow( deleteIndex ); selectNearestQuestion( deleteIndex ); } } ); addButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { tableModel.addRow( new Object[] { "Extra fragment", false } ); } } ); moveUpButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { moveSelectedItem( -1 ); } } ); moveDownButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { moveSelectedItem( 1 ); } } ); selectionModel.addListSelectionListener( new ListSelectionListener() { public void valueChanged( ListSelectionEvent e ) { int index = selectionModel.getMinSelectionIndex(); if ( index >= 0 ) { deleteButton.setEnabled( true ); moveUpButton.setEnabled( index != 0 ); moveDownButton.setEnabled( index != extraFragmentsTable.getRowCount() - 1 ); } else { deleteButton.setEnabled( false ); moveUpButton.setEnabled( false ); moveDownButton.setEnabled( false ); } } } ); } private void selectNearestQuestion( int index ) { if ( tableModel.getRowCount() > 0 ) { int newIndex = Math.max( 0, index - 1 ); selectionModel.setSelectionInterval( newIndex, newIndex ); } } private void moveSelectedItem( int offset ) { int index = selectionModel.getMinSelectionIndex(); tableModel.moveRow( index, index, index + offset ); selectionModel.setSelectionInterval( index + offset, index + offset ); } private void launchPreviewDialog( String html ) { PreviewHtmlDialog dialog = new PreviewHtmlDialog( getParentDialog(), html ); dialog.setSize( PreviewHtmlDialog.PREVIEW_HTML_DIALOG_DEFAULT_DIMENSION ); dialog.setLocationRelativeTo( getParentDialog() ); dialog.setVisible( true ); } private JDialog getParentDialog() { // TODO: Panel shouldn't really know where it's placed return (JDialog) SwingUtilities.getAncestorOfClass( JDialog.class, this ); } private DefaultTableModel makeExtraFragmentsTableModel( DragAndDropQuestion question ) { List<String> extraFragments = question.getExtraFragments(); Object[][] tableRows = new Object[extraFragments.size()][]; for ( int i = 0; i < extraFragments.size(); i++ ) tableRows[i] = new Object[] { extraFragments.get( i ) }; DefaultTableModel model = new DefaultTableModel( tableRows, new String[] { "Extra fragments" } ) { @Override public Class<?> getColumnClass( int columnIndex ) { return java.lang.String.class; } }; return model; } public DragAndDropQuestion getQuestion() { List<String> extraFragments = getExtraFragments(); return new DragAndDropQuestion( questionTextArea.getText(), explanationTextArea.getText(), extraFragments, reuseFragmentsCheckBox.isSelected() ); } private List<String> getExtraFragments() { List<String> fragments = new ArrayList<String>(); for ( int row = 0; row < tableModel.getRowCount(); row++ ) fragments.add( (String) tableModel.getValueAt( row, 0 ) ); return fragments; } public void setQuestionValidityListener( QuestionValidityListener listener ) { // Always valid } }