/*- * #%L * Fiji distribution of ImageJ for the life sciences. * %% * Copyright (C) 2007 - 2017 Fiji developers. * %% * 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 (at your option) 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, see * <http://www.gnu.org/licenses/gpl-2.0.html>. * #L% */ package spim.fiji.spimdata.explorer.registration; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.Arrays; import javax.swing.JLabel; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.DefaultTableCellRenderer; import mpicbg.spim.data.generic.sequence.BasicViewDescription; import mpicbg.spim.data.registration.ViewRegistration; import mpicbg.spim.data.registration.ViewRegistrations; import mpicbg.spim.data.registration.ViewTransform; import mpicbg.spim.data.registration.ViewTransformAffine; import net.imglib2.realtransform.AffineTransform3D; public class RegistrationExplorerPanel extends JPanel { private static final long serialVersionUID = -3767947754096099774L; final RegistrationExplorer< ?, ? > explorer; protected JTable table; protected RegistrationTableModel tableModel; protected JLabel label; protected ArrayList< ViewTransform > cache; public RegistrationExplorerPanel( final ViewRegistrations viewRegistrations, final RegistrationExplorer< ?, ? > explorer ) { this.cache = new ArrayList< ViewTransform >(); this.explorer = explorer; initComponent( viewRegistrations ); } public RegistrationTableModel getTableModel() { return tableModel; } public JTable getTable() { return table; } public void updateViewDescription( final BasicViewDescription< ? > vd ) { if ( vd != null && label != null ) this.label.setText( "View Description --- Timepoint: " + vd.getTimePointId() + ", View Setup Id: " + vd.getViewSetupId() ); if ( vd == null ) this.label.setText( "No or multiple View Descriptions selected"); tableModel.updateViewDescription( vd ); if ( table.getSelectedRowCount() == 0 ) table.getSelectionModel().setSelectionInterval( 0, 0 ); } public void initComponent( final ViewRegistrations viewRegistrations ) { tableModel = new RegistrationTableModel( viewRegistrations, this ); table = new JTable(); table.setModel( tableModel ); table.setSurrendersFocusOnKeystroke( true ); table.setSelectionMode( ListSelectionModel.SINGLE_INTERVAL_SELECTION ); final DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer(); centerRenderer.setHorizontalAlignment( JLabel.CENTER ); // center all columns for ( int column = 0; column < tableModel.getColumnCount(); ++column ) table.getColumnModel().getColumn( column ).setCellRenderer( centerRenderer ); table.setPreferredScrollableViewportSize( new Dimension( 1020, 300 ) ); table.getColumnModel().getColumn( 0 ).setPreferredWidth( 300 ); for ( int i = 1; i < table.getColumnCount(); ++i ) table.getColumnModel().getColumn( i ).setPreferredWidth( 100 ); final Font f = table.getFont(); table.setFont( new Font( f.getName(), f.getStyle(), 11 ) ); this.setLayout( new BorderLayout() ); this.label = new JLabel( "View Description --- " ); this.add( label, BorderLayout.NORTH ); this.add( new JScrollPane( table ), BorderLayout.CENTER ); addPopupMenu( table ); } protected void copySelection() { cache.clear(); if ( table.getSelectedRowCount() == 0 ) { JOptionPane.showMessageDialog( table, "Nothing selected"); return; } else { final BasicViewDescription< ? > vd = tableModel.getCurrentViewDescription(); if ( vd == null ) { JOptionPane.showMessageDialog( table, "No active viewdescription." ); return; } final ViewRegistration vr = tableModel.getViewRegistrations().getViewRegistration( vd ); for ( int row : table.getSelectedRows() ) { cache.add( duplicate( vr.getTransformList().get( row ) ) ); System.out.println( "Copied row " + vr.getTransformList().get( row ).getName() ); } } } /** * * @param type 0 == before, 1 == replace, 2 == after */ protected void pasteSelection( final int type ) { if ( cache.size() == 0 ) { JOptionPane.showMessageDialog( table, "Nothing copied so far." ); return; } if ( table.getSelectedRowCount() == 0 ) { JOptionPane.showMessageDialog( table, "Nothing selected." ); return; } final BasicViewDescription< ? > vd = tableModel.getCurrentViewDescription(); if ( vd == null ) { JOptionPane.showMessageDialog( table, "No active viewdescription." ); return; } final ViewRegistration vr = tableModel.getViewRegistrations().getViewRegistration( vd ); // check out where to start inserting final int[] selectedRows = table.getSelectedRows(); Arrays.sort( selectedRows ); int insertAt; if ( type == 0 ) { insertAt = selectedRows[ 0 ]; } else if ( type == 1 ) { insertAt = selectedRows[ 0 ]; // remove the selected entries for ( int i = selectedRows[ selectedRows.length - 1 ]; i >= selectedRows[ 0 ]; --i ) vr.getTransformList().remove( i ); } else { insertAt = selectedRows[ selectedRows.length - 1 ] + 1; } // add the new entries final ArrayList< ViewTransform > newList = new ArrayList< ViewTransform >(); // add the old entries for ( int i = 0; i < insertAt; ++i ) newList.add( vr.getTransformList().get( i ) ); // add the copied ones for ( int i = 0; i < cache.size(); ++i ) newList.add( duplicate( cache.get( i ) ) ); // add the rest for ( int i = insertAt; i < vr.getTransformList().size(); ++i ) newList.add( vr.getTransformList().get( i ) ); vr.getTransformList().clear(); vr.getTransformList().addAll( newList ); vr.updateModel(); // update everything tableModel.fireTableDataChanged(); } protected static ViewTransform duplicate( final ViewTransform vt ) { final AffineTransform3D t = new AffineTransform3D(); t.set( vt.asAffine3D().getRowPackedCopy() ); return new ViewTransformAffine( vt.getName(), t ); } protected static ViewTransform newName( final ViewTransform vt, final String name ) { final AffineTransform3D t = new AffineTransform3D(); t.set( vt.asAffine3D().getRowPackedCopy() ); return new ViewTransformAffine( name, t ); } protected static ViewTransform newMatrixEntry( final ViewTransform vt, final double value, final int index ) { final AffineTransform3D t = new AffineTransform3D(); final double[] m = vt.asAffine3D().getRowPackedCopy(); m[ index ] = value; t.set( m ); return new ViewTransformAffine( vt.getName(), t ); } protected void delete() { if ( table.getSelectedRowCount() == 0 ) { JOptionPane.showMessageDialog( table, "Nothing selected." ); return; } final BasicViewDescription< ? > vd = tableModel.getCurrentViewDescription(); if ( vd == null ) { JOptionPane.showMessageDialog( table, "No active viewdescription." ); return; } final int[] selectedRows = table.getSelectedRows(); Arrays.sort( selectedRows ); final ViewRegistration vr = tableModel.getViewRegistrations().getViewRegistration( vd ); for ( int i = selectedRows[ selectedRows.length - 1 ]; i >= selectedRows[ 0 ]; --i ) vr.getTransformList().remove( i ); if ( vr.getTransformList().isEmpty() ) vr.getTransformList().add( new ViewTransformAffine( null, new AffineTransform3D() ) ); vr.updateModel(); // update everything tableModel.fireTableDataChanged(); } protected void addPopupMenu( final JTable table ) { final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem copyItem = new JMenuItem( "Copy" ); JMenuItem deleteItem = new JMenuItem( "Delete" ); JMenuItem pasteBeforeItem = new JMenuItem( "Paste before selection" ); JMenuItem pasteAndRepaceItem = new JMenuItem( "Paste and replace selection" ); JMenuItem pasteAfterItem = new JMenuItem( "Paste after selection" ); copyItem.addActionListener(new ActionListener() { @Override public void actionPerformed( final ActionEvent e ) { copySelection(); } }); pasteBeforeItem.addActionListener(new ActionListener() { @Override public void actionPerformed( final ActionEvent e ) { pasteSelection( 0 ); } }); pasteAndRepaceItem.addActionListener(new ActionListener() { @Override public void actionPerformed( final ActionEvent e ) { pasteSelection( 1 ); } }); pasteAfterItem.addActionListener(new ActionListener() { @Override public void actionPerformed( final ActionEvent e ) { pasteSelection( 2 ); } }); deleteItem.addActionListener(new ActionListener() { @Override public void actionPerformed( final ActionEvent e ) { delete(); System.out.println( "Right-click performed on table and choose DELETE" ); } }); popupMenu.add( copyItem ); popupMenu.add( pasteBeforeItem ); popupMenu.add( pasteAndRepaceItem ); popupMenu.add( pasteAfterItem ); popupMenu.add( deleteItem ); table.setComponentPopupMenu( popupMenu ); } }