//----------------------------------------------------------------------------// // // // P i x e l B o a r d // // // //----------------------------------------------------------------------------// // <editor-fold defaultstate="collapsed" desc="hdr"> // // Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. // // This software is released under the GNU General Public License. // // Goto http://kenai.com/projects/audiveris to report bugs or suggestions. // //----------------------------------------------------------------------------// // </editor-fold> package omr.sheet.ui; import omr.selection.LocationEvent; import omr.selection.MouseMovement; import omr.selection.PixelLevelEvent; import omr.selection.SelectionHint; import omr.selection.UserEvent; import omr.sheet.Sheet; import omr.ui.Board; import omr.ui.field.LIntegerField; import omr.ui.util.Panel; import com.jgoodies.forms.builder.PanelBuilder; import com.jgoodies.forms.layout.CellConstraints; import com.jgoodies.forms.layout.FormLayout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.awt.Rectangle; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.KeyStroke; /** * Class {@code PixelBoard} is a board that displays pixel information as * provided by other entities (output side), and which can also be used by a * user to directly specify pixel coordinate values by entering numerical values * in the fields (input side). * * @author Hervé Bitteur */ public class PixelBoard extends Board { //~ Static fields/initializers --------------------------------------------- /** Usual logger utility */ private static final Logger logger = LoggerFactory.getLogger( PixelBoard.class); /** Events this entity is interested in */ private static final Class<?>[] eventClasses = new Class<?>[]{ LocationEvent.class, PixelLevelEvent.class }; //~ Instance fields -------------------------------------------------------- /** Abscissa of upper Left point */ private final LIntegerField x = new LIntegerField( "X", "Abscissa of upper left corner"); /** Ordinate of upper Left point */ private final LIntegerField y = new LIntegerField( "Y", "Ordinate of upper left corner"); /** Width of rectangle */ private final LIntegerField width = new LIntegerField( "Width", "Width of rectangle"); /** Height of rectangle */ private final LIntegerField height = new LIntegerField( "Height", "Height of rectangle"); /** Pixel gray level */ private final LIntegerField level = new LIntegerField( false, "Level", "Pixel level"); //~ Constructors ----------------------------------------------------------- //------------// // PixelBoard // //------------// /** * Create a PixelBoard. * * @param sheet the related sheet */ public PixelBoard (Sheet sheet) { super( Board.PIXEL, sheet.getLocationService(), eventClasses, false, true); // Needed to process user input when RETURN/ENTER is pressed getComponent() .getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) .put(KeyStroke.getKeyStroke("ENTER"), "ParamAction"); getComponent() .getActionMap() .put("ParamAction", new ParamAction()); defineLayout(); } //~ Methods ---------------------------------------------------------------- //---------// // onEvent // //---------// /** * Call-back triggered when Location Selection has been modified. * * @param event the selection event */ @Override public void onEvent (UserEvent event) { try { // Ignore RELEASING if (event.movement == MouseMovement.RELEASING) { return; } logger.debug("PixelBoard: {}", event); if (event instanceof LocationEvent) { // Display rectangle attributes LocationEvent sheetLocation = (LocationEvent) event; Rectangle rect = sheetLocation.getData(); if (rect != null) { x.setValue(rect.x); y.setValue(rect.y); width.setValue(rect.width); height.setValue(rect.height); return; } x.setText(""); y.setText(""); width.setText(""); height.setText(""); } else if (event instanceof PixelLevelEvent) { // Display pixel gray level PixelLevelEvent pixelLevelEvent = (PixelLevelEvent) event; final Integer pixelLevel = pixelLevelEvent.getData(); if (pixelLevel != null) { level.setValue(pixelLevel); } else { level.setText(""); } } } catch (Exception ex) { logger.warn(getClass().getName() + " onEvent error", ex); } } //--------------// // defineLayout // //--------------// private void defineLayout () { FormLayout layout = Panel.makeFormLayout(2, 3); // Specify that columns 1, 5 & 9 as well as 3, 7 & 11 have equal widths layout.setColumnGroups( new int[][]{ {1, 5, 9}, {3, 7, 11} }); PanelBuilder builder = new PanelBuilder(layout, getBody()); builder.setDefaultDialogBorder(); CellConstraints cst = new CellConstraints(); int r = 1; // -------------------------------- builder.add(x.getLabel(), cst.xy(1, r)); builder.add(x.getField(), cst.xy(3, r)); x.getField() .setColumns(5); builder.add(width.getLabel(), cst.xy(5, r)); builder.add(width.getField(), cst.xy(7, r)); builder.add(level.getLabel(), cst.xy(9, r)); builder.add(level.getField(), cst.xy(11, r)); r += 2; // -------------------------------- builder.add(y.getLabel(), cst.xy(1, r)); builder.add(y.getField(), cst.xy(3, r)); builder.add(height.getLabel(), cst.xy(5, r)); builder.add(height.getField(), cst.xy(7, r)); } //~ Inner Classes ---------------------------------------------------------- //-------------// // ParamAction // //-------------// private class ParamAction extends AbstractAction { //~ Methods ------------------------------------------------------------ // Method run whenever user presses Return/Enter in one of the parameter // fields @Override public void actionPerformed (ActionEvent e) { // Remember & forward the new pixel selection // A rectangle (which can be degenerated to a point) getSelectionService() .publish( new LocationEvent( PixelBoard.this, SelectionHint.LOCATION_INIT, MouseMovement.PRESSING, new Rectangle( x.getValue(), y.getValue(), width.getValue(), height.getValue()))); } } }