package com.kartoflane.superluminal2.ui; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Scale; import org.eclipse.swt.widgets.Shell; import com.kartoflane.common.swt.ui.SquareColorPickerDialog; import com.kartoflane.ftl.floorgen.FloorImageFactory; import com.kartoflane.superluminal2.Superluminal; import com.kartoflane.superluminal2.components.enums.OS; import com.kartoflane.superluminal2.core.Cache; import com.kartoflane.superluminal2.utils.UIUtils; import com.kartoflane.superluminal2.utils.Utils; public class FloorgenDialog { private static FloorgenDialog instance = null; private static RGB currentBorder = null; private static RGB currentFloor = null; private static FloorImageFactory lastResult = new FloorImageFactory(); private static Point lastPosition = null; private final Shell shell; private final Scale sclBorder; private final Scale sclMargin; private final Scale sclCorner; private final Label lblColorBorder; private final Label lblColorFloor; private FloorImageFactory result = lastResult; private boolean initd = false; public FloorgenDialog( final Shell parent ) { if ( instance != null ) throw new IllegalStateException( "Previous instance has not been disposed!" ); instance = this; shell = new Shell( parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL ); shell.setText( Superluminal.APP_NAME + " - Floor Image Generator" ); GridLayout gl_shell = new GridLayout( 3, false ); gl_shell.verticalSpacing = 15; shell.setLayout( gl_shell ); Image imgInfo = Cache.checkOutImage( this, "cpath:/assets/help.png" ); Composite composite = new Composite( shell, SWT.NONE ); GridLayout gl_composite = new GridLayout( 5, false ); gl_composite.marginWidth = 0; gl_composite.marginHeight = 0; composite.setLayout( gl_composite ); composite.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true, 3, 1 ) ); Label lblBorder = new Label( composite, SWT.NONE ); lblBorder.setText( "Border Width" ); sclBorder = new Scale( composite, SWT.NONE ); sclBorder.setPageIncrement( 1 ); sclBorder.setMaximum( 10 ); sclBorder.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, true, false, 2, 1 ) ); Label lblBorderInfo = new Label( composite, SWT.NONE ); lblBorderInfo.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false, 2, 1 ) ); lblBorderInfo.setImage( imgInfo ); String msg = "This specifies the width of the border, in pixels."; UIUtils.addTooltip( lblBorderInfo, Utils.wrapOSNot( msg, Superluminal.WRAP_WIDTH, Superluminal.WRAP_TOLERANCE, OS.MACOSX() ) ); Label lblMargin = new Label( composite, SWT.NONE ); lblMargin.setText( "Border Margin" ); sclMargin = new Scale( composite, SWT.NONE ); sclMargin.setPageIncrement( 1 ); sclMargin.setMaximum( 10 ); sclMargin.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, true, false, 2, 1 ) ); Label lblMarginInfo = new Label( composite, SWT.NONE ); lblMarginInfo.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false, 2, 1 ) ); lblMarginInfo.setImage( imgInfo ); msg = "This specifies the distance from room walls to the border, in pixels. Basically, how much of the floor image should be visible."; UIUtils.addTooltip( lblMarginInfo, Utils.wrapOSNot( msg, Superluminal.WRAP_WIDTH, Superluminal.WRAP_TOLERANCE, OS.MACOSX() ) ); Label lblCornerSize = new Label( composite, SWT.NONE ); lblCornerSize.setText( "Corner Size" ); sclCorner = new Scale( composite, SWT.NONE ); sclCorner.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, false, false, 2, 1 ) ); sclCorner.setPageIncrement( 1 ); sclCorner.setMaximum( Math.max( 1, result.getFloorMargin() ) ); sclCorner.setEnabled( result.getFloorMargin() > 0 ); Label lblCornerSizeInfo = new Label( composite, SWT.NONE ); lblCornerSizeInfo.setLayoutData( new GridData( SWT.LEFT, SWT.CENTER, false, false, 2, 1 ) ); lblCornerSizeInfo.setImage( imgInfo ); msg = "This specifies size of corners, in pixels. Maximum value depends on the current floor margin. Generally 0 means square, max - triangular."; UIUtils.addTooltip( lblCornerSizeInfo, Utils.wrapOSNot( msg, Superluminal.WRAP_WIDTH, Superluminal.WRAP_TOLERANCE, OS.MACOSX() ) ); Label lblBorderColor = new Label( composite, SWT.NONE ); lblBorderColor.setText( "Border Color" ); Composite cColorBorder = new Composite( composite, SWT.NONE ); cColorBorder.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 4, 1 ) ); GridLayout gl_cColorBorder = new GridLayout( 2, false ); gl_cColorBorder.marginWidth = 0; gl_cColorBorder.marginHeight = 0; cColorBorder.setLayout( gl_cColorBorder ); lblColorBorder = new Label( cColorBorder, SWT.BORDER ); lblColorBorder.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false, 1, 1 ) ); lblColorBorder.setText( " " ); Button btnSelectColorBorder = new Button( cColorBorder, SWT.NONE ); GridData gd_btnSelectColorBorder = new GridData( SWT.LEFT, SWT.CENTER, false, false, 1, 1 ); gd_btnSelectColorBorder.widthHint = 80; btnSelectColorBorder.setLayoutData( gd_btnSelectColorBorder ); btnSelectColorBorder.setText( "Select Color" ); Label lblFloorColor = new Label( composite, SWT.NONE ); lblFloorColor.setText( "Floor Color" ); Composite cColorFloor = new Composite( composite, SWT.NONE ); cColorFloor.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false, 4, 1 ) ); GridLayout gl_cColorFloor = new GridLayout( 2, false ); gl_cColorFloor.marginWidth = 0; gl_cColorFloor.marginHeight = 0; cColorFloor.setLayout( gl_cColorFloor ); lblColorFloor = new Label( cColorFloor, SWT.BORDER ); lblColorFloor.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false, 1, 1 ) ); lblColorFloor.setText( " " ); Button btnSelectColorFloor = new Button( cColorFloor, SWT.NONE ); GridData gd_btnSelectColorFloor = new GridData( SWT.LEFT, SWT.CENTER, false, false, 1, 1 ); gd_btnSelectColorFloor.widthHint = 80; btnSelectColorFloor.setLayoutData( gd_btnSelectColorFloor ); btnSelectColorFloor.setText( "Select Color" ); Button btnDefault = new Button( shell, SWT.NONE ); GridData gd_btnDefault = new GridData( SWT.LEFT, SWT.CENTER, false, false, 1, 1 ); gd_btnDefault.widthHint = 80; btnDefault.setLayoutData( gd_btnDefault ); btnDefault.setText( "Defaults" ); Button btnConfirm = new Button( shell, SWT.NONE ); GridData gd_btnConfirm = new GridData( SWT.RIGHT, SWT.CENTER, true, false, 1, 1 ); gd_btnConfirm.widthHint = 80; btnConfirm.setLayoutData( gd_btnConfirm ); btnConfirm.setText( "Confirm" ); Button btnCancel = new Button( shell, SWT.NONE ); GridData gd_btnCancel = new GridData( SWT.LEFT, SWT.CENTER, false, false, 1, 1 ); gd_btnCancel.widthHint = 80; btnCancel.setLayoutData( gd_btnCancel ); btnCancel.setText( "Cancel" ); shell.pack(); updateUI(); btnConfirm.forceFocus(); sclBorder.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { result.setBorderWidth( sclBorder.getSelection() ); } } ); sclMargin.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { result.setFloorMargin( sclMargin.getSelection() ); sclCorner.setMaximum( Math.max( 1, result.getFloorMargin() ) ); sclCorner.setEnabled( result.getFloorMargin() > 0 ); result.setCornerSize( Math.max( 0, result.getFloorMargin() - sclCorner.getSelection() ) ); } } ); sclCorner.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { result.setCornerSize( Math.max( 0, result.getFloorMargin() - sclCorner.getSelection() ) ); } } ); btnCancel.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { result = null; dispose(); } } ); btnConfirm.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { lastResult = result; dispose(); } } ); btnDefault.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { result = new FloorImageFactory(); updateUI(); } } ); btnSelectColorBorder.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { SquareColorPickerDialog cpd = new SquareColorPickerDialog( shell ); cpd.setText( Superluminal.APP_NAME + " - Color Picker (Border Color)" ); java.awt.Color c = result.getBorderColor(); RGB input = new RGB( c.getRed(), c.getGreen(), c.getBlue() ); RGB rgb = cpd.open( input ); if ( rgb != null ) { java.awt.Color color = new java.awt.Color( rgb.red, rgb.green, rgb.blue ); result.setBorderColor( color ); updateUI(); } } } ); btnSelectColorFloor.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( SelectionEvent e ) { SquareColorPickerDialog cpd = new SquareColorPickerDialog( shell ); cpd.setText( Superluminal.APP_NAME + " - Color Picker (Floor Color)" ); java.awt.Color c = result.getFloorColor(); RGB input = new RGB( c.getRed(), c.getGreen(), c.getBlue() ); RGB rgb = cpd.open( input ); if ( rgb != null ) { java.awt.Color color = new java.awt.Color( rgb.red, rgb.green, rgb.blue ); result.setFloorColor( color ); updateUI(); } } } ); shell.addListener( SWT.Close, new Listener() { @Override public void handleEvent( Event e ) { e.doit = false; result = null; dispose(); } } ); shell.addControlListener( new ControlAdapter() { @Override public void controlMoved( ControlEvent e ) { if ( initd ) { lastPosition = shell.getLocation(); lastPosition.x -= parent.getLocation().x; lastPosition.y -= parent.getLocation().y; } } } ); if ( lastPosition != null ) { Point p = parent.getLocation(); p.x += lastPosition.x; p.y += lastPosition.y; shell.setLocation( p ); } else { Point size = shell.getSize(); shell.setSize( size.x + 5, size.y ); Point parSize = parent.getSize(); Point parLoc = parent.getLocation(); shell.setLocation( parLoc.x + parSize.x / 2 - size.x / 2, parLoc.y + parSize.y / 3 - size.y / 2 ); } initd = true; } public FloorImageFactory open() { shell.open(); Display d = shell.getDisplay(); while ( !shell.isDisposed() ) { if ( !d.readAndDispatch() ) d.sleep(); } return result; } public void dispose() { Cache.checkInColor( this, currentBorder ); Cache.checkInColor( this, currentFloor ); Cache.checkInImage( this, "cpath:/assets/help.png" ); instance = null; shell.dispose(); } private void updateUI() { sclBorder.setSelection( result.getBorderWidth() ); sclMargin.setSelection( result.getFloorMargin() ); sclCorner.setMaximum( Math.max( 1, result.getFloorMargin() ) ); sclCorner.setEnabled( result.getFloorMargin() > 0 ); sclCorner.setSelection( result.getFloorMargin() - result.getCornerSize() ); if ( currentBorder != null ) Cache.checkInColor( this, currentBorder ); currentBorder = rgb( result.getBorderColor() ); Color color = Cache.checkOutColor( this, currentBorder ); lblColorBorder.setBackground( color ); if ( currentFloor != null ) Cache.checkInColor( this, currentFloor ); currentFloor = rgb( result.getFloorColor() ); color = Cache.checkOutColor( this, currentFloor ); lblColorFloor.setBackground( color ); } private RGB rgb( java.awt.Color color ) { return new RGB( color.getRed(), color.getGreen(), color.getBlue() ); } }