Blimp v.1.3.2 (2008-02-23)
Christian Heimke

Christian Heimke commited on 2011-07-15 09:23:24
Showing 9 changed files, with 336 additions and 142 deletions.

... ...
@@ -1,8 +1,13 @@
1 1
 BlinkenLightsInteractiveMovieProgram
2
-Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
3 3
 Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
4 4
 a blinkenarea.org project
5
-powered by eventphone.de
5
+
6
+version 1.3.2 date 2008-02-23
7
+-----------------------------
8
+ - added menu items for known formats
9
+   - thanks to Christian Heimke for the idea and the first implementation
10
+ - added buttons to initialize color buttons to gray and to color
6 11
 
7 12
 version 1.3.1 date 2006-10-17
8 13
 -----------------------------
... ...
@@ -1,9 +1,8 @@
1 1
 # BlinkenLightsInteractiveMovieProgram
2
-# version 1.3.1 date 2006-10-17
3
-# Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+# version 1.3.2 date 2008-02-23
3
+# Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
 # Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
 # a blinkenarea.org project
6
-# powered by eventphone.de
7 6
 
8 7
 BLINKEN_LIB=../BlinkenLibJava/BlinkenLib.jar
9 8
 
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -32,6 +31,30 @@ public class Blimp extends JApplet
32 31
   static final int defHeight = 8, defWidth = 8, defChannels = 1, defMaxval = 127, defDuration = 100;
33 32
   static final int ZoomAspectResolution = 30;
34 33
 
34
+  //known formats
35
+  static final String[] knownFormats =
36
+  {
37
+    "Blinkenlights (18x8-1/2)",
38
+    "Blinkenlights Arcade (26x20-1/16)",
39
+    "Blinkenlights reloaded (18x8-1/16)",
40
+    "bluebox (98x7-1/128)",
41
+    "PixelCurtain (18x8-3/256)",
42
+    "TROIA big walls (104x32-1/128)",
43
+    "TROIA ceiling (104x80-1/128)",
44
+    "TROIA small walls (80x32-1/128)",
45
+  };
46
+
47
+  //known sizes
48
+  static final String[] knownSizes =
49
+  {
50
+    "Blinkenlights (18x8)",
51
+    "Blinkenlights Arcade (26x20)",
52
+    "bluebox (98x7)",
53
+    "TROIA big walls (104x32)",
54
+    "TROIA ceiling (104x80)",
55
+    "TROIA small walls (80x32)",
56
+  };
57
+
35 58
   //configuration variables
36 59
   boolean isFullApp = false; //if running as full application
37 60
   String initialFile = null;
... ...
@@ -43,7 +66,9 @@ public class Blimp extends JApplet
43 66
   JMenu menuFile, menuInfo, menuEdit, menuFrameSel, menuPlay, menuHelp; //menus
44 67
   JMenuItem menuFileNew, menuFileLoad, menuFileSave, menuFileSaveAs, menuFileQuit;
45 68
   JMenuItem menuInfoShow, menuInfoAdd, menuInfoDelete;
46
-  JMenuItem menuEditResize, menuEditScale;
69
+  JMenu menuEditResize, menuEditScale;
70
+  JMenuItem menuEditResizeUser, menuEditScaleUser;
71
+  JMenuItem menuEditResizeKnown[], menuEditScaleKnown[];
47 72
   JMenuItem menuEditInsertFrame, menuEditDuplicateFrame, menuEditDeleteFrame;
48 73
   JMenuItem menuFrameSelNone, menuFrameSelSingle, menuFrameSelStart, menuFrameSelEnd;
49 74
   JMenuItem menuFrameSelCopy, menuFrameSelMove, menuFrameSelReverse, menuFrameSelDelete;
... ...
@@ -73,7 +98,8 @@ public class Blimp extends JApplet
73 98
   JButton buttonActionsRollLeft, buttonActionsRollRight, buttonActionsRollUp, buttonActionsRollDown;
74 99
   JButton buttonActionsUndo, buttonActionsRedo;
75 100
   JButton buttonEditInsertFrame, buttonEditDuplicateFrame, buttonEditDeleteFrame;
76
-  JPanel panelColorsChoose, panelColorsSettings, panelColorsColor, panelColorsAlpha;
101
+  JButton buttonColorsPredefGray, buttonColorsPredefColor;
102
+  JPanel panelColorsChoose, panelColorsSettings, panelColorsPredef, panelColorsColor, panelColorsAlpha;
77 103
   JToggleButton buttonsColor[];
78 104
   ButtonGroup groupColor;
79 105
   JLabel labelColorsColor, labelColorsAlpha;
... ...
@@ -175,7 +201,7 @@ public class Blimp extends JApplet
175 201
     labelStatus.setText( "new movie..." );
176 202
     curFile = null;
177 203
     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
178
-    curMovie.insertInfo( 0, "creator", "Blimp (version 1.3.1 date 2006-10-17)" );
204
+    curMovie.insertInfo( 0, "creator", "Blimp (version 1.3.2 date 2008-02-23)" );
179 205
     curMovie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
180 206
     curMovieChanged = false;
181 207
 
... ...
@@ -398,115 +424,133 @@ public class Blimp extends JApplet
398 424
     }
399 425
   }
400 426
 
401
-  //"Edit Resize Movie..." was chosen from menu
402
-  private void actionEditResize( )
427
+  //get format or size from bracket in string
428
+  private String getFormatOrSize( String str )
403 429
   {
404
-    Pattern sizePattern;
405
-    String curSize;
406
-    Object size;
407
-    Matcher sizeMatcher;
430
+    Pattern pattern;
431
+    Matcher matcher;
408 432
 
409
-    //initialize size pattern
410
-    sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
433
+    pattern = Pattern.compile( "^.*\\(([^()]*)\\)$" );
434
+    if( (matcher = pattern.matcher( str )).find( ) )
435
+      return matcher.group( 1 );
436
+    else
437
+      return "";
438
+  }
411 439
 
412
-    //get string with current movie size
413
-    curSize = curMovie.getWidth( ) + "x" +
440
+  //resize to format
441
+  private boolean actionEditResizeToFormat( String format )
442
+  {
443
+    Pattern formatPattern;
444
+    Matcher formatMatcher;
445
+
446
+    //initialize format pattern
447
+    formatPattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
448
+
449
+    //check format
450
+    if( ! (formatMatcher = formatPattern.matcher( format )).find( ) ) //abort and return error if format not valid
451
+      return false;
452
+
453
+    //resize movie
454
+    curMovie.resize( Integer.parseInt( formatMatcher.group( 2 ) ),
455
+                     Integer.parseInt( formatMatcher.group( 1 ) ),
456
+                     Integer.parseInt( formatMatcher.group( 3 ) ),
457
+                     Integer.parseInt( formatMatcher.group( 4 ) ) - 1 );
458
+    curMovieChanged = true;
459
+
460
+    //update controls
461
+    updateFrames( scrollFrames.getValue( ) );
462
+
463
+    //update status
464
+    labelStatus.setText( "movie resized successfully to " + format + "..." );
465
+
466
+    return true;
467
+  }
468
+
469
+  //"Edit Resize Movie user defined format..." was chosen from menu
470
+  private void actionEditResizeUser( )
471
+  {
472
+    String curFormat;
473
+    Object format;
474
+
475
+    //get string with current movie format
476
+    curFormat = curMovie.getWidth( ) + "x" +
414 477
                 curMovie.getHeight( ) + "-" + 
415 478
                 curMovie.getChannels( ) + "/" + 
416 479
                 (curMovie.getMaxval( ) + 1);
417 480
 
418 481
     //ask until cancel or answer is valid
419
-    size = curSize;
482
+    format = curFormat;
420 483
     do
421 484
     {
422
-      //ask for new size
423
-      size = JOptionPane.showInputDialog( dialogParent,
424
-                                          "Current movie size is:   " + curSize + "\n\n" +
425
-                                          "The format is:   <width>x<height>-<channels>/<colors>\n" + 
426
-                                          "     18x8-1/2     (Blinkenlights)\n" + 
427
-                                          "     18x8-1/16     (Blinkenlights Reloaded)\n" + 
428
-                                          "     26x20-1/16     (Blinkenlights Arcade)\n" + 
429
-                                          "     104x32-1/128     (TROIA big walls)\n" + 
430
-                                          "     80x32-1/128     (TROIA small walls)\n" + 
431
-                                          "     104x80-1/128     (TROIA floor + ceiling)\n" +
432
-                                          "     98x7-1/128     (bluebox)\n\n" +
433
-                                          "Please enter the new movie size:",
485
+      //ask for new format
486
+      format = JOptionPane.showInputDialog( dialogParent,
487
+                                            "Current movie format is:   " + curFormat + "\n\n" +
488
+                                            "The format is:   <width>x<height>-<channels>/<colors>\n\n" +
489
+                                            "Please enter the new movie format:",
434 490
                                             "Blimp - Resize Movie...",
435 491
                                             JOptionPane.QUESTION_MESSAGE,
436
-                                          null, null, size );
492
+                                            null, null, format );
437 493
       //dialog was cancelled
438
-      if( size == null )
494
+      if( format == null )
439 495
         return;
440 496
     }
441
-    while( ! (sizeMatcher = sizePattern.matcher( size.toString( ) )).find( ) ); //repeat question if answer not valid
497
+    while( ! actionEditResizeToFormat( format.toString( ) ) ); //repeat question if answer not valid
498
+  }
442 499
 
443
-    //resize movie
444
-    curMovie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
445
-                     Integer.parseInt( sizeMatcher.group( 1 ) ),
446
-                     Integer.parseInt( sizeMatcher.group( 3 ) ),
447
-                     Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
500
+  // scale to size
501
+  private boolean actionEditScaleToSize( String size )
502
+  {
503
+    Pattern sizePattern;
504
+    Matcher sizeMatcher;
505
+
506
+    //initialize size pattern
507
+    sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
508
+
509
+    //ask until cancel or answer is valid
510
+    if( ! (sizeMatcher = sizePattern.matcher( size.toString( ) )).find( ) ) //abort and return error if size not valid
511
+      return false;
512
+
513
+    //scale movie
514
+    curMovie.scale( Integer.parseInt( sizeMatcher.group( 2 ) ),
515
+                    Integer.parseInt( sizeMatcher.group( 1 ) ) );
448 516
     curMovieChanged = true;
449 517
 
450 518
     //update controls
451 519
     updateFrames( scrollFrames.getValue( ) );
452 520
 
453 521
     //update status
454
-    labelStatus.setText( "movie resized successfully to " + size.toString( ) + "..." );
522
+    labelStatus.setText( "movie scaled successfully to " + size + "..." );
523
+
524
+    return true;
455 525
   }
456 526
 
457
-  //"Edit Scale Movie..." was chosen from menu
458
-  private void actionEditScale( )
527
+  //"Edit Scale Movie user defined size..." was chosen from menu
528
+  private void actionEditScaleUser( )
459 529
   {
460
-    Pattern dimPattern;
461
-    String curDim, curSize;
462
-    Object dim;
463
-    Matcher dimMatcher;
464
-
465
-    //initialize dimension pattern
466
-    dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
530
+    String curSize;
531
+    Object size;
467 532
 
468 533
     //get string with current movie size
469
-    curDim = curMovie.getWidth( ) + "x" +
470
-             curMovie.getHeight( );
471 534
     curSize = curMovie.getWidth( ) + "x" +
472
-              curMovie.getHeight( ) + "-" + 
473
-              curMovie.getChannels( ) + "/" + 
474
-              (curMovie.getMaxval( ) + 1);
535
+              curMovie.getHeight( );
475 536
 
476 537
     //ask until cancel or answer is valid
477
-    dim = curDim;
538
+    size = curSize;
478 539
     do
479 540
     {
480 541
       //ask for new size
481
-      dim = JOptionPane.showInputDialog( dialogParent,
482
-                                         "Current movie dimension is:   " + curDim + " (" + curSize + ")\n\n" +
483
-                                         "The format is:   <width>x<height>\n" + 
484
-                                         "     18x8     (Blinkenlights, Blinkenlights Reloaded)\n" + 
485
-                                         "     26x20     (Blinkenlights Arcade)\n" + 
486
-                                         "     104x32     (TROIA big walls)\n" + 
487
-                                         "     80x32     (TROIA small walls)\n" + 
488
-                                         "     104x80     (TROIA floor + ceiling)\n" +
489
-                                         "     98x7     (bluebox)\n\n" +
542
+      size = JOptionPane.showInputDialog( dialogParent,
543
+                                          "Current movie dimension is:   " + curSize + "\n\n" +
544
+                                          "The format is:   <width>x<height>\n\n" + 
490 545
                                           "Please enter the new movie dimension:",
491 546
                                           "Blimp - Scale Movie...",
492 547
                                           JOptionPane.QUESTION_MESSAGE,
493
-                                         null, null, dim );
548
+                                          null, null, size );
494 549
       //dialog was cancelled
495
-      if( dim == null )
550
+      if( size == null )
496 551
         return;
497 552
     }
498
-    while( ! (dimMatcher = dimPattern.matcher( dim.toString( ) )).find( ) ); //repeat question if answer not valid
499
-
500
-    //scale movie
501
-    curMovie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
502
-                    Integer.parseInt( dimMatcher.group( 1 ) ) );
503
-    curMovieChanged = true;
504
-
505
-    //update controls
506
-    updateFrames( scrollFrames.getValue( ) );
507
-
508
-    //update status
509
-    labelStatus.setText( "movie scaled successfully to " + dim.toString( ) + "..." );
553
+    while( ! actionEditScaleToSize( size.toString( ) ) ); //repeat question if answer not valid
510 554
   }
511 555
 
512 556
   //"Edit Insert Frame" was chosen from menu / Insert Frame button was pressed
... ...
@@ -986,11 +1030,10 @@ public class Blimp extends JApplet
986 1030
   {
987 1031
     JOptionPane.showMessageDialog( dialogParent,
988 1032
                                    "BlinkenLightsInteractiveMovieProgram\n" +
989
-                                   "version 1.3.1 date 2006-10-17\n" +
990
-                                   "Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>\n" +
1033
+                                   "version 1.3.2 date 2008-02-23\n" +
1034
+                                   "Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>\n" +
991 1035
                                    "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
992
-                                   "a blinkenarea.org project\n" +
993
-                                   "powered by eventphone.de",
1036
+                                   "a blinkenarea.org project",
994 1037
                                    "Blimp - About...",
995 1038
                                    JOptionPane.INFORMATION_MESSAGE );
996 1039
   }
... ...
@@ -1307,11 +1350,10 @@ public class Blimp extends JApplet
1307 1350
     showDuration( );
1308 1351
   }
1309 1352
 
1310
-  //generate a color icon from a color
1311
-  private void iconFromColor( ImageIcon icon, Color color )
1353
+  //generate a gray gradient icon
1354
+  private void iconGradientGray( ImageIcon icon )
1312 1355
   {
1313
-    int height, width, y, x;
1314
-    boolean yy, xx;
1356
+    int height, width, val, x;
1315 1357
     Graphics graphics;
1316 1358
 
1317 1359
     //get size
... ...
@@ -1321,22 +1363,59 @@ public class Blimp extends JApplet
1321 1363
     //get graphics context of icon's image
1322 1364
     graphics = icon.getImage( ).getGraphics( );
1323 1365
 
1324
-    //draw background
1325
-    graphics.setColor( new Color( color.getRed( ), color.getGreen( ), color.getBlue( ) ) );
1326
-    graphics.fillRect( 0, 0, width / 2, height );
1327
-    for( y = 0, yy = false; y < height; y += height / 4, yy = ! yy )
1328
-    {
1329
-      for( x = width / 2, xx = yy; x < width; x += width / 6, xx = ! xx )
1366
+    //draw gradient to icon
1367
+    for( x = 0; x < width; x++ ) {
1368
+      val = x * 255 / (width - 1);
1369
+      graphics.setColor( new Color( val, val, val ) );
1370
+      graphics.drawLine( x, 0, x, height );
1371
+    }
1372
+  }
1373
+
1374
+  //generate a color gradient icon
1375
+  private void iconGradientColor( ImageIcon icon )
1330 1376
   {
1331
-        if( xx )
1332
-          graphics.setColor( Color.white );
1333
-        else
1334
-          graphics.setColor( Color.black );
1335
-        graphics.fillRect( x, y, width / 6, height / 4 );
1377
+    int height, width, val, step, x;
1378
+    Graphics graphics;
1379
+
1380
+    //get size
1381
+    height = icon.getIconHeight( );
1382
+    width = icon.getIconWidth( );
1383
+
1384
+    //get graphics context of icon's image
1385
+    graphics = icon.getImage( ).getGraphics( );
1386
+
1387
+    //draw gradient to icon
1388
+    for( x = 0; x < width; x++ ) {
1389
+      val = x * 6 * 255 / (width - 1);
1390
+      step = val / 255;
1391
+      val %= 255;
1392
+      switch( step ) {
1393
+        case 0: graphics.setColor( new Color( 255, val, 0 ) ); break;
1394
+        case 1: graphics.setColor( new Color( 255 - val, 255, 0 ) ); break;
1395
+        case 2: graphics.setColor( new Color( 0, 255, val ) ); break;
1396
+        case 3: graphics.setColor( new Color( 0, 255 - val, 255 ) ); break;
1397
+        case 4: graphics.setColor( new Color( val, 0, 255 ) ); break;
1398
+        case 5: graphics.setColor( new Color( 255, 0, 255 - val ) ); break;
1336 1399
       }
1400
+      graphics.drawLine( x, 0, x, height );
1337 1401
     }
1402
+  }
1403
+
1404
+  //generate a color icon from a color
1405
+  private void iconFromColor( ImageIcon icon, Color color )
1406
+  {
1407
+    int height, width, y, x;
1408
+    boolean yy, xx;
1409
+    Graphics graphics;
1410
+
1411
+    //get size
1412
+    height = icon.getIconHeight( );
1413
+    width = icon.getIconWidth( );
1338 1414
 
1339
-    //draw foreground in specified color
1415
+    //get graphics context of icon's image
1416
+    graphics = icon.getImage( ).getGraphics( );
1417
+
1418
+    //fill icon in specified color
1340 1419
     graphics.setColor( color );
1341 1420
     graphics.fillRect( 0, 0, width, height );
1342 1421
   }
... ...
@@ -1394,6 +1473,60 @@ public class Blimp extends JApplet
1394 1473
     textColorsColor.setText( hex.toUpperCase( ) );
1395 1474
   }
1396 1475
 
1476
+  //gray predefined colors have been chosen
1477
+  private void actionColorsPredefGray( )
1478
+  {
1479
+    int i, val;
1480
+
1481
+    //update color buttons
1482
+    for( i = 0; i < constColorCnt; i++ )
1483
+    {
1484
+      val = (constColorCnt - 1 - i) * 255 / (constColorCnt - 1);
1485
+      colors[i] = new Color( val, val, val );
1486
+      iconFromColor( iconsColor[i], colors[i] );
1487
+      buttonsColor[i].repaint( );
1488
+    }
1489
+
1490
+    //update current color
1491
+    showColorsColor( );
1492
+    frameEditor.setColor( colors[colorIdx] );
1493
+  }
1494
+
1495
+  //colorful predefined colors have been chosen
1496
+  private void actionColorsPredefColor( )
1497
+  {
1498
+    int i, val, step;
1499
+
1500
+    //update color buttons
1501
+    for( i = 0; i < constColorCnt; i++ )
1502
+    {
1503
+      if( i == 0 )
1504
+        colors[i] = new Color( 255, 255, 255 );
1505
+      else if( i == 1 )
1506
+        colors[i] = new Color( 0, 0, 0 );
1507
+      else
1508
+      {
1509
+        val = (i - 2) * 6 * 255 / (constColorCnt - 2);
1510
+        step = val / 255;
1511
+        val %= 255;
1512
+        switch( step ) {
1513
+          case 0: colors[i] = new Color( 255, val, 0 ); break;
1514
+          case 1: colors[i] = new Color( 255 - val, 255, 0 ); break;
1515
+          case 2: colors[i] = new Color( 0, 255, val ); break;
1516
+          case 3: colors[i] = new Color( 0, 255 - val, 255 ); break;
1517
+          case 4: colors[i] = new Color( val, 0, 255 ); break;
1518
+          case 5: colors[i] = new Color( 255, 0, 255 - val ); break;
1519
+        }
1520
+      }
1521
+      iconFromColor( iconsColor[i], colors[i] );
1522
+      buttonsColor[i].repaint( );
1523
+    }
1524
+
1525
+    //update current color
1526
+    showColorsColor( );
1527
+    frameEditor.setColor( colors[colorIdx] );
1528
+  }
1529
+
1397 1530
   //color select button was pressed
1398 1531
   private void actionColorsColor( )
1399 1532
   {
... ...
@@ -1619,10 +1752,10 @@ public class Blimp extends JApplet
1619 1752
       actionInfoAdd( );
1620 1753
     else if( e.getSource( ) == menuInfoDelete )
1621 1754
       actionInfoDelete( );
1622
-    else if( e.getSource( ) == menuEditResize )
1623
-      actionEditResize( );
1624
-    else if( e.getSource( ) == menuEditScale )
1625
-      actionEditScale( );
1755
+    else if( e.getSource( ) == menuEditResizeUser )
1756
+      actionEditResizeUser( );
1757
+    else if( e.getSource( ) == menuEditScaleUser )
1758
+      actionEditScaleUser( );
1626 1759
     else if( e.getSource( ) == menuEditInsertFrame )
1627 1760
       actionEditInsertFrame( );
1628 1761
     else if( e.getSource( ) == menuEditDuplicateFrame )
... ...
@@ -1717,6 +1850,10 @@ public class Blimp extends JApplet
1717 1850
       actionEditDuplicateFrame( );
1718 1851
     else if( e.getSource( ) == buttonEditDeleteFrame )
1719 1852
       actionEditDeleteFrame( );
1853
+    else if( e.getSource( ) == buttonColorsPredefGray )
1854
+      actionColorsPredefGray( );
1855
+    else if( e.getSource( ) == buttonColorsPredefColor )
1856
+      actionColorsPredefColor( );
1720 1857
     else if( e.getSource( ) == buttonColorsColor )
1721 1858
       actionColorsColor( );
1722 1859
     else if( e.getSource( ) == textColorsColor )
... ...
@@ -1725,11 +1862,35 @@ public class Blimp extends JApplet
1725 1862
       validateColorsAlpha( );
1726 1863
     else
1727 1864
     {
1865
+      do //abuse of break
1866
+      {
1867
+        for( i = 0; i < menuEditResizeKnown.length; i++ )
1868
+          if( e.getSource( ) == menuEditResizeKnown[i] )
1869
+            break;
1870
+        if( i < menuEditResizeKnown.length )
1871
+        {
1872
+          actionEditResizeToFormat( getFormatOrSize( knownFormats[i] ) );
1873
+          break;
1874
+        }
1875
+
1876
+        for( i = 0; i < menuEditScaleKnown.length; i++ )
1877
+          if( e.getSource( ) == menuEditScaleKnown[i] )
1878
+            break;
1879
+        if( i < menuEditScaleKnown.length )
1880
+        {
1881
+          actionEditScaleToSize( getFormatOrSize( knownSizes[i] ) );
1882
+          break;
1883
+        }
1884
+
1728 1885
         for( i = 0; i < constColorCnt; i++ )
1729 1886
           if( e.getSource( ) == buttonsColor[i] )
1730 1887
             break;
1731 1888
         if( i < constColorCnt )
1889
+        {
1732 1890
           actionColorIdx( i );
1891
+          break;
1892
+        }
1893
+      } while( false ); //end abuse of break
1733 1894
     }
1734 1895
   }
1735 1896
 
... ...
@@ -1846,12 +2007,13 @@ public class Blimp extends JApplet
1846 2007
   {
1847 2008
     int i, val;
1848 2009
     Dimension size;
2010
+    ImageIcon icon;
1849 2011
     Insets smallMargin;
1850 2012
 
1851 2013
     //initialize current movie, frame
1852 2014
     curDir = new File( "." );
1853 2015
     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
1854
-    curMovie.insertInfo( 0, "creator", "Blimp (version 1.3.1 date 2006-10-17)" );
2016
+    curMovie.insertInfo( 0, "creator", "Blimp (version 1.3.2 date 2008-02-23)" );
1855 2017
     curMovie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
1856 2018
     curFrame = null;
1857 2019
 
... ...
@@ -1940,14 +2102,34 @@ public class Blimp extends JApplet
1940 2102
     menuEdit = new JMenu( "Edit" );
1941 2103
     menuEdit.setMnemonic( KeyEvent.VK_E );
1942 2104
     menubar.add( menuEdit );
1943
-    menuEditResize = new JMenuItem( "Resize Movie..." );
1944
-    menuEditResize.setMnemonic( KeyEvent.VK_R );
1945
-    menuEditResize.addActionListener( this );
2105
+    menuEditResize = new JMenu("Resize Movie");
1946 2106
     menuEdit.add( menuEditResize );
1947
-    menuEditScale = new JMenuItem( "Scale Movie..." );
1948
-    menuEditScale.setMnemonic( KeyEvent.VK_S );
1949
-    menuEditScale.addActionListener( this );
2107
+    menuEditResize.setMnemonic( KeyEvent.VK_R );
2108
+    menuEditResizeUser = new JMenuItem( "user defined format..." );
2109
+    menuEditResizeUser.addActionListener( this );
2110
+    menuEditResize.add( menuEditResizeUser );
2111
+    menuEditResize.addSeparator( );
2112
+    menuEditResizeKnown = new JMenuItem[knownFormats.length];
2113
+    for( i = 0; i < knownFormats.length; i++ )
2114
+    {
2115
+      menuEditResizeKnown[i] = new JMenuItem( knownFormats[i] );
2116
+      menuEditResizeKnown[i].addActionListener( this );
2117
+      menuEditResize.add( menuEditResizeKnown[i] );
2118
+    }
2119
+    menuEditScale = new JMenu ( "Scale Movie" );
1950 2120
     menuEdit.add( menuEditScale );
2121
+    menuEditScale.setMnemonic( KeyEvent.VK_S );
2122
+    menuEditScaleUser = new JMenuItem( "user defined size..." );
2123
+    menuEditScaleUser.addActionListener( this );
2124
+    menuEditScale.add( menuEditScaleUser );
2125
+    menuEditScale.addSeparator( );
2126
+    menuEditScaleKnown = new JMenuItem[knownSizes.length];
2127
+    for( i = 0; i < knownSizes.length; i++ )
2128
+    {
2129
+      menuEditScaleKnown[i] = new JMenuItem( knownSizes[i] );
2130
+      menuEditScaleKnown[i].addActionListener( this );
2131
+      menuEditScale.add( menuEditScaleKnown[i] );
2132
+    }
1951 2133
     menuEdit.addSeparator( );
1952 2134
     menuEditInsertFrame = new JMenuItem( "Insert Frame" );
1953 2135
     menuEditInsertFrame.setMnemonic( KeyEvent.VK_I );
... ...
@@ -2346,8 +2528,18 @@ public class Blimp extends JApplet
2346 2528
       panelColorsChoose.add( buttonsColor[i] );
2347 2529
     }
2348 2530
     //color panel - settings
2349
-    panelColorsSettings = new JPanel( new GridLayout( 4, 1, 5, 0 ) );
2531
+    panelColorsSettings = new JPanel( new GridLayout( 5, 1, 5, 0 ) );
2350 2532
     panelColors.add( panelColorsSettings );
2533
+    panelColorsPredef = new JPanel( new GridLayout( 1, 2, 5, 5 ) );
2534
+    buttonColorsPredefGray = new JButton( );
2535
+    buttonColorsPredefGray.addActionListener( this );
2536
+    buttonColorsPredefGray.setToolTipText( "gray" );
2537
+    panelColorsPredef.add( buttonColorsPredefGray );
2538
+    buttonColorsPredefColor = new JButton( );
2539
+    buttonColorsPredefColor.addActionListener( this );
2540
+    buttonColorsPredefColor.setToolTipText( "color" );
2541
+    panelColorsPredef.add( buttonColorsPredefColor );
2542
+    panelColorsSettings.add( panelColorsPredef );
2351 2543
     labelColorsColor = new JLabel( "color:" );
2352 2544
     labelColorsColor.setVerticalAlignment( JLabel.BOTTOM );
2353 2545
     panelColorsSettings.add( labelColorsColor );
... ...
@@ -2381,24 +2573,29 @@ public class Blimp extends JApplet
2381 2573
     textColorsAlpha.addFocusListener( this );
2382 2574
     panelColorsAlpha.add( textColorsAlpha );
2383 2575
     labelColorsAlpha.setLabelFor( panelColorsAlpha );
2384
-    //color panel - color icons
2576
+
2577
+    //initialize colors
2385 2578
     colorIdx = 0;
2386 2579
     colors = new Color[constColorCnt];
2387
-    size = textColorsAlpha.getPreferredSize( );
2388 2580
     iconsColor = new ImageIcon[constColorCnt];
2581
+    size = textColorsAlpha.getPreferredSize( );
2389 2582
     for( i = 0; i < constColorCnt; i++ )
2390 2583
     {
2391 2584
       iconsColor[i] = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2392
-      val = (constColorCnt - 1 - i) * 255 / (constColorCnt - 1);
2393
-      colors[i] = new Color( val, val, val );
2394
-      iconFromColor( iconsColor[i], colors[i] );
2585
+      buttonsColor[i].setIcon( iconsColor[i] );
2395 2586
       buttonsColor[i].setIcon( iconsColor[i] );
2396 2587
     }
2588
+    icon = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2589
+    iconGradientGray( icon );
2590
+    buttonColorsPredefGray.setIcon( icon );
2591
+    icon = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2592
+    iconGradientColor( icon );
2593
+    buttonColorsPredefColor.setIcon( icon );
2397 2594
     iconColorsColor = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2398
-    iconFromColor( iconColorsColor, colors[colorIdx] );
2399 2595
     buttonColorsColor.setIcon( iconColorsColor );
2400 2596
     buttonsColor[colorIdx].setSelected( true );
2401 2597
     frameEditor.setColor( colors[colorIdx] );
2598
+    actionColorsPredefGray( );
2402 2599
 
2403 2600
     //create play timer
2404 2601
     timerPlay = new javax.swing.Timer( 100, this );
... ...
@@ -2471,11 +2668,10 @@ public class Blimp extends JApplet
2471 2668
 
2472 2669
     //running as command line tool
2473 2670
     System.out.println( "BlinkenLightsInteractiveMovieProgram\n" +
2474
-                        "version 1.3.1 date 2006-10-17\n" +
2475
-                        "Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>\n" +
2671
+                        "version 1.3.2 date 2008-02-23\n" +
2672
+                        "Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>\n" +
2476 2673
                         "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
2477
-                        "a blinkenarea.org project\n" +
2478
-                        "powered by eventphone.de\n" );
2674
+                        "a blinkenarea.org project\n" );
2479 2675
 
2480 2676
     //initialize patterns
2481 2677
     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
... ...
@@ -2483,7 +2679,7 @@ public class Blimp extends JApplet
2483 2679
 
2484 2680
     //get initial movie
2485 2681
     movie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
2486
-    movie.insertInfo( 0, "creator", "Blimp (version 1.3.1 date 2006-10-17)" );
2682
+    movie.insertInfo( 0, "creator", "Blimp (version 1.3.2 date 2008-02-23)" );
2487 2683
     movie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
2488 2684
 
2489 2685
     //process parameters
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
... ...
@@ -1,9 +1,8 @@
1 1
 /* BlinkenLightsInteractiveMovieProgram
2
- * version 1.3.1 date 2006-10-17
3
- * Copyright (C) 2004-2006: Stefan Schuermans <1stein@schuermans.info>
2
+ * version 1.3.2 date 2008-02-23
3
+ * Copyright (C) 2004-2008: Stefan Schuermans <stefan@schuermans.info>
4 4
  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5 5
  * a blinkenarea.org project
6
- * powered by eventphone.de
7 6
  */
8 7
 
9 8
 package org.blinkenarea.Blimp;
10 9