4f88fca3f1ca46972ed32d49ecafa1884f3eb0c0
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1) /* BlinkenLightsInteractiveMovieProgram
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

2)  * version 0.6 date 2005-03-10
3)  * Copyright (C) 2004-2005: Stefan Schuermans <1stein@schuermans.info>
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

4)  * Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html
5)  * a blinkenarea.org project
6)  * powered by eventphone.de
7)  */
8) 
9) import java.applet.*;
10) import java.awt.*;
11) import java.awt.event.*;
12) import java.awt.image.*;
13) import javax.swing.*;
14) import javax.swing.border.*;
15) import javax.swing.event.*;
16) import java.io.*;
17) import java.util.*;
18) import java.util.regex.*;
19) import java.net.*;
20) 
21) public class Blimp extends JApplet
22)              implements Runnable, WindowListener, ActionListener,
23)                         AdjustmentListener, ChangeListener, FocusListener,
24)                         DocumentListener, BlinkenFrameEditorListener
25) {
26)   //configuration constants
27)   static final int constColorCntX = 2, constColorCntY = 4;
28)   static final int constColorCnt = constColorCntX * constColorCntY;
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

29)   static final int defHeight = 8, defWidth = 8, defChannels = 1, defMaxval = 127, defDuration = 100;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

30) 
31)   //configuration variables
32)   boolean isFullApp = false; //if running as full application
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

33)   String initialFile = null;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

34) 
35)   //GUI elements
36)   JFrame frame; //main window (if running as full application)
37)   Component dialogParent; //parent to use for dialogs
38)   JMenuBar menubar; //menubar in main window
39)   JMenu menuFile, menuInfo, menuEdit, menuPlay, menuHelp; //menus
40)   JMenuItem menuFileNew, menuFileLoad, menuFileSave, menuFileSaveAs, menuFileQuit;
41)   JMenuItem menuInfoShow, menuInfoAdd, menuInfoDelete;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

42)   JMenuItem menuEditResize, menuEditScale;
43)   JMenuItem menuEditInsertFrame, menuEditDuplicateFrame, menuEditDeleteFrame;
44)   JMenuItem menuEditImportFrame;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

45)   JMenuItem menuPlayStart, menuPlayStop;
46)   JCheckBoxMenuItem menuPlayBegin, menuPlayLoop;
47)   JMenuItem menuHelpAbout;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

48)   JPanel panel, panelStatus, panelMain, panelFrames, panelOuterFrame; //panels of main window
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

49)   JPanel panelMiddleFrame, panelFrame, panelDuration, panelColors;
50)   JLabel labelStatus, labelFrames, labelFrameInfo, labelDuration;
51)   JScrollBar scrollFrames;
52)   JSlider sliderFrameZoom;
53)   BlinkenFrameEditor frameEditor;
54)   JScrollPane scrollpaneFrame;
55)   JTextField textDuration;
56)   JPanel panelOuterTools, panelMiddleTools, panelTools, panelActions;
57)   JToggleButton buttonToolsNone, buttonToolsColorPicker, buttonToolsDot, buttonToolsLine;
58)   JToggleButton buttonToolsRect, buttonToolsFilledRect, buttonToolsCircle, buttonToolsFilledCircle;
59)   JToggleButton buttonToolsCopy, buttonToolsPaste;
60)   ButtonGroup groupTools;
61)   JButton buttonActionsInvert, buttonActionsRotate90, buttonActionsRotate180, buttonActionsRotate270;
62)   JButton buttonActionsMirrorHor, buttonActionsMirrorVer, buttonActionsMirrorDiag, buttonActionsMirrorDiag2;
63)   JButton buttonActionsRollLeft, buttonActionsRollRight, buttonActionsRollUp, buttonActionsRollDown;
64)   JButton buttonActionsUndo, buttonActionsRedo;
65)   JPanel panelColorsChoose, panelColorsSettings, panelColorsColor, panelColorsAlpha;
66)   JToggleButton buttonsColor[];
67)   ButtonGroup groupColor;
68)   JLabel labelColorsColor, labelColorsAlpha;
69)   JButton buttonColorsColor;
70)   JSlider sliderColorsAlpha;
71)   JTextField textColorsColor, textColorsAlpha;
72) 
73)   //other variables
74)   int colorIdx; //index of selected color
75)   Color colors[]; //current colors
76)   ImageIcon iconsColor[], iconColorsColor; //color icons shown in color panel 
77)   javax.swing.Timer timerPlay; //timer used for playing movies
78) 
79)   //file, movie, frame
80)   File curDir = null, curFile = null; //current directory and file
81)   BlinkenMovie curMovie = null; //current movie
82)   boolean curMovieChanged = false; //if changes have been made to current movie
83)   BlinkenFrame curFrame = null; //current frame
84) 
85)   //constructor for applet
86)   public Blimp( )
87)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

88)     isFullApp = false;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

89)   }
90) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

91)   //constructor for full application - perhaps load an initial file (filename != null)
92)   public Blimp( String filename )
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

93)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

94)     isFullApp = true;
95)     initialFile = filename;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

96)   }
97) 
98)   //load an image
99)   private ImageIcon loadImageIcon( String name )
100)   {
101)     URL url = Blimp.class.getResource( "images/" + name );
102)     if( url != null )
103)       return new ImageIcon( url );
104)     else
105)       return new ImageIcon( new BufferedImage( 1, 1, BufferedImage.TYPE_INT_RGB ) );
106)   }
107) 
108)   //perhaps ask if to save changes and perhaps do it
109)   //return true on cancel
110)   private boolean askSaveChanges( )
111)   {
112)     int retVal;
113) 
114)     //ask only when changes were made
115)     if( curMovieChanged )
116)     {
117)       //ask if to save changes
118)       retVal = JOptionPane.showConfirmDialog( dialogParent,
119)                                               "Do You want to save the changes?",
120)                                               "Blimp - Save changes?",
121)                                               JOptionPane.YES_NO_CANCEL_OPTION,
122)                                               JOptionPane.QUESTION_MESSAGE );
123)       //cancelled
124)       if( retVal == JOptionPane.CANCEL_OPTION )
125)         return true;
126)       //save
127)       if( retVal == JOptionPane.YES_OPTION )
128)         actionFileSave( );
129)     }
130) 
131)     //not cancelled
132)     return false;
133)   }
134) 
135)   //"File New" was chosen from menu
136)   private void actionFileNew( )
137)   {
138)     //ask if to save changes
139)     if( askSaveChanges( ) ) //returns true on cancel
140)       return;
141) 
142)     //create a new movie
143)     if( frame != null )
144)       frame.setTitle( "Blimp" );
145)     labelStatus.setText( "new movie..." );
146)     curFile = null;
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

147)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

148)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.6 date 2005-03-10)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

149)     curMovie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

150)     curMovieChanged = false;
151) 
152)     //update controls
153)     updateFrames( 0 );
154)   }
155) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

156)   //load file (filename is taken from curFile)
157)   private void fileLoad( )
158)   {
159)     if( curMovie.load( curFile.getPath( ) ) )
160)     {
161)       //success
162)       if( frame != null )
163)         frame.setTitle( "Blimp - " + curFile.getPath( ) );
164)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" was loaded successfully..." );
165)       curMovieChanged = false;
166)     }
167)     else
168)     {
169)       //some error
170)       if( frame != null )
171)         frame.setTitle( "Blimp" );
172)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" could not be loaded..." );
173)       curFile = null;
174)       curMovieChanged = false;
175)     }
176) 
177)     //update controls
178)     updateFrames( 0 );
179)   }
180) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

181)   //"File Load" was chosen from menu
182)   private void actionFileLoad( )
183)   {
184)     JFileChooser fileChooser;
185) 
186)     //ask if to save changes
187)     if( askSaveChanges( ) ) //returns true on cancel
188)       return;
189) 
190)     //show file select dialog
191)     fileChooser = new JFileChooser( );
192)     fileChooser.setDialogTitle( "Blimp - Load..." );
193)     fileChooser.setFileFilter( new BlinkenFileFilter( ) );
194)     if( curDir != null )
195)       fileChooser.setCurrentDirectory( curDir );
196)     if( fileChooser.showOpenDialog( dialogParent ) == JFileChooser.APPROVE_OPTION )
197)     {
198)       //save current directory and current file
199)       curDir = fileChooser.getCurrentDirectory( );
200)       curFile = fileChooser.getSelectedFile( );
201)       //load file
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

202)       fileLoad( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

203)     }
204)   }
205) 
206)   //"File Save" was chosen from menu
207)   private void actionFileSave( )
208)   {
209)     //just call "File Save as" if no current file
210)     if( curFile == null )
211)     {
212)       actionFileSaveAs( );
213)       return;
214)     }
215)     //save file
216)     if( curMovie.save( curFile.getPath( ) ) )
217)     {
218)       //success
219)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" was saved successfully..." );
220)       curMovieChanged = false;
221)     }
222)     else
223)     {
224)       //some error
225)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" could not be saved..." );
226)     }
227)   }
228) 
229)   //"File Save as" was chosen from menu
230)   private void actionFileSaveAs( )
231)   {
232)     JFileChooser fileChooser;
233) 
234)     //show file select dialog
235)     fileChooser = new JFileChooser( );
236)     fileChooser.setDialogTitle( "Blimp - Save as..." );
237)     fileChooser.setFileFilter( new BlinkenFileFilter( ) );
238)     if( curDir != null )
239)       fileChooser.setCurrentDirectory( curDir );
240)     if( curFile != null )
241)       fileChooser.setSelectedFile( curFile );
242)     if( fileChooser.showSaveDialog( dialogParent ) == JFileChooser.APPROVE_OPTION )
243)     {
244)       //save current directory and file
245)       curDir = fileChooser.getCurrentDirectory( );
246)       curFile = fileChooser.getSelectedFile( );
247)       if( frame != null )
248)         frame.setTitle( "Blimp - " + curFile.getPath( ) );
249)       //just call "File Save" to do the work
250)       actionFileSave( );
251)     }
252)   }
253) 
254)   //"File Quit" was chosen from menu
255)   private void actionFileQuit( )
256)   {
257)     //ask if to save changes
258)     if( askSaveChanges( ) ) //returns true on cancel
259)       return;
260) 
261)     //only end program if runnning as full application
262)     if( isFullApp )
263)       System.exit( 0 );
264)   }
265)   
266)   //"Information Show..." was chosen from menu
267)   private void actionInfoShow( )
268)   {
269)     int i, cnt;
270)     String info;
271) 
272)     //get information about movie
273)     info = "";
274)     cnt = curMovie.getInfoCnt( );
275)     for( i = 0; i < cnt; i++ )
276)       info += "\n" + curMovie.getInfoType( i ) +
277)               ": " + curMovie.getInfoData( i );
278) 
279)     //show information
280)     JOptionPane.showMessageDialog( dialogParent,
281)                                    "Information about movie:\n" + info,
282)                                    "Blimp - Show Information...",
283)                                    JOptionPane.INFORMATION_MESSAGE );
284)   }
285) 
286)   //"Information Add..." was chosen from menu
287)   private void actionInfoAdd( )
288)   {
289)     Pattern infoPattern;
290)     Object info;
291)     Matcher infoMatcher;
292) 
293)     //initialize info pattern
294)     infoPattern = Pattern.compile( "^([A-Za-z0-9]+)(?: *= *|: *)(.*)$" );
295) 
296)     //ask for information to add
297)     info = JOptionPane.showInputDialog( dialogParent,
298)                                         "Please enter the information to add:\n\n" +
299)                                         "The format is:   <info-type>: <info-text>\n" + 
300)                                         "     title: <title of movie>\n" + 
301)                                         "     description: <short description of movie content>\n" + 
302)                                         "     creator: <program this movie was created with>\n" + 
303)                                         "     author: <name of author(s)>\n" + 
304)                                         "     email: <email address of author>\n" + 
305)                                         "     url: <homepage of author or of this movie>", 
306)                                         "Blimp - Add Information...",
307)                                         JOptionPane.QUESTION_MESSAGE,
308)                                         null, null, "" );
309)     //dialog was cancelled
310)     if( info == null )
311)       return;
312) 
313)     //add info
314)     if( (infoMatcher = infoPattern.matcher( info.toString( ) )).find( ) )
315)       curMovie.insertInfo( curMovie.getInfoCnt( ), infoMatcher.group( 1 ), infoMatcher.group( 2 ) );
316)     else
317)       curMovie.insertInfo( curMovie.getInfoCnt( ), "description", info.toString( ) );
318)     curMovieChanged = true;
319)   }
320) 
321)   //"Information Delete..." was chosen from menu
322)   private void actionInfoDelete( )
323)   {
324)     int i, cnt;
325)     String info[];
326)     Object selected;
327) 
328)     //get information about movie
329)     cnt = curMovie.getInfoCnt( );
330)     info = new String[cnt];
331)     for( i = 0; i < cnt; i++ )
332)       info[i] = curMovie.getInfoType( i ) + ": " + 
333)                 curMovie.getInfoData( i );
334) 
335)     //ask for new size
336)     selected = JOptionPane.showInputDialog( dialogParent,
337)                                             "Select information to delete:",
338)                                             "Blimp - Delete Information...",
339)                                             JOptionPane.QUESTION_MESSAGE,
340)                                             null, info, null );
341)     //dialog was cancelled
342)     if( selected == null )
343)       return;
344) 
345)     //delete sected information
346)     for( i = 0; i < cnt; i++ )
347)       if( info[i] == selected )
348)         break;
349)     if( i < cnt )
350)     {
351)       curMovie.deleteInfo( i );
352)       curMovieChanged = true;
353)     }
354)   }
355) 
356)   //"Edit Resize Movie..." was chosen from menu
357)   private void actionEditResize( )
358)   {
359)     Pattern sizePattern;
360)     String curSize;
361)     Object size;
362)     Matcher sizeMatcher;
363) 
364)     //initialize size pattern
365)     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
366) 
367)     //get string with current movie size
368)     curSize = curMovie.getWidth( ) + "x" +
369)               curMovie.getHeight( ) + "-" + 
370)               curMovie.getChannels( ) + "/" + 
371)               (curMovie.getMaxval( ) + 1);
372) 
373)     //ask until cancel or answer is valid
374)     size = curSize;
375)     do
376)     {
377)       //ask for new size
378)       size = JOptionPane.showInputDialog( dialogParent,
379)                                           "Current movie size is:   " + curSize + "\n\n" +
380)                                           "The format is:   <width>x<height>-<channels>/<colors>\n" + 
381)                                           "     18x8-1/2     (Blinkenlights)\n" + 
382)                                           "     18x8-1/16     (Blinkenlights Reloaded)\n" + 
383)                                           "     26x20-1/16     (Blinkenlights Arcade)\n" + 
384)                                           "     104x32-1/128     (TROIA big walls)\n" + 
385)                                           "     80x32-1/128     (TROIA small walls)\n" + 
386)                                           "     104x80-1/128     (TROIA floor + ceiling)\n\n" + 
387)                                           "Please enter the new movie size:",
388)                                           "Blimp - Resize Movie...",
389)                                           JOptionPane.QUESTION_MESSAGE,
390)                                           null, null, size );
391)       //dialog was cancelled
392)       if( size == null )
393)         return;
394)     }
395)     while( ! (sizeMatcher = sizePattern.matcher( size.toString( ) )).find( ) ); //repeat question if answer not valid
396) 
397)     //resize movie
398)     curMovie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
399)                      Integer.parseInt( sizeMatcher.group( 1 ) ),
400)                      Integer.parseInt( sizeMatcher.group( 3 ) ),
401)                      Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
402)     curMovieChanged = true;
403) 
404)     //update controls
405)     updateFrames( scrollFrames.getValue( ) );
406) 
407)     //update status
408)     labelStatus.setText( "movie resized successfully to " + size.toString( ) + "..." );
409)   }
410) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

411)   //"Edit Scale Movie..." was chosen from menu
412)   private void actionEditScale( )
413)   {
414)     Pattern dimPattern;
415)     String curDim, curSize;
416)     Object dim;
417)     Matcher dimMatcher;
418) 
419)     //initialize dimension pattern
420)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
421) 
422)     //get string with current movie size
423)     curDim = curMovie.getWidth( ) + "x" +
424)              curMovie.getHeight( );
425)     curSize = curMovie.getWidth( ) + "x" +
426)               curMovie.getHeight( ) + "-" + 
427)               curMovie.getChannels( ) + "/" + 
428)               (curMovie.getMaxval( ) + 1);
429) 
430)     //ask until cancel or answer is valid
431)     dim = curDim;
432)     do
433)     {
434)       //ask for new size
435)       dim = JOptionPane.showInputDialog( dialogParent,
436)                                          "Current movie dimension is:   " + curDim + " (" + curSize + ")\n\n" +
437)                                          "The format is:   <width>x<height>\n" + 
438)                                          "     18x8     (Blinkenlights, Blinkenlights Reloaded)\n" + 
439)                                          "     26x20     (Blinkenlights Arcade)\n" + 
440)                                          "     104x32     (TROIA big walls)\n" + 
441)                                          "     80x32     (TROIA small walls)\n" + 
442)                                          "     104x80     (TROIA floor + ceiling)\n\n" + 
443)                                          "Please enter the new movie dimension:",
444)                                          "Blimp - Scale Movie...",
445)                                          JOptionPane.QUESTION_MESSAGE,
446)                                          null, null, dim );
447)       //dialog was cancelled
448)       if( dim == null )
449)         return;
450)     }
451)     while( ! (dimMatcher = dimPattern.matcher( dim.toString( ) )).find( ) ); //repeat question if answer not valid
452) 
453)     //scale movie
454)     curMovie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
455)                     Integer.parseInt( dimMatcher.group( 1 ) ) );
456)     curMovieChanged = true;
457) 
458)     //update controls
459)     updateFrames( scrollFrames.getValue( ) );
460) 
461)     //update status
462)     labelStatus.setText( "movie scaled successfully to " + dim.toString( ) + "..." );
463)   }
464) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

465)   //"Edit Insert Frame" was chosen from menu
466)   private void actionEditInsertFrame( )
467)   {
468)     BlinkenFrame frame;
469)     int frameCnt, frameNo;
470) 
471)     //create new empty frame
472)     frame = new BlinkenFrame( curMovie.getHeight( ), curMovie.getWidth( ),
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

473)                               curMovie.getChannels( ), curMovie.getMaxval( ), defDuration );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

474)     frame.clear( );
475) 
476)     //insert frame behind current position
477)     frameCnt = curMovie.getFrameCnt( );
478)     frameNo = scrollFrames.getValue( ) + 1;
479)     if( frameNo < 0 )
480)       frameNo = 0;
481)     if( frameNo > frameCnt )
482)       frameNo = frameCnt;
483)     curMovie.insertFrame( frameNo, frame );
484)     curMovieChanged = true;
485) 
486)     //update controls
487)     updateFrames( frameNo );
488)   }
489) 
490)   //"Edit Duplicate Frame" was chosen from menu
491)   private void actionEditDuplicateFrame( )
492)   {
493)     BlinkenFrame frame;
494)     int frameCnt, frameNo;
495) 
496)     //do nothing if there is no current frame
497)     if( curFrame == null )
498)       return;
499) 
500)     //duplicate current frame
501)     frame = new BlinkenFrame( curFrame );
502) 
503)     //insert frame behind current position
504)     frameCnt = curMovie.getFrameCnt( );
505)     frameNo = scrollFrames.getValue( ) + 1;
506)     if( frameNo < 0 )
507)       frameNo = 0;
508)     if( frameNo > frameCnt )
509)       frameNo = frameCnt;
510)     curMovie.insertFrame( frameNo, frame );
511)     curMovieChanged = true;
512) 
513)     //update controls
514)     updateFrames( frameNo );
515)   }
516) 
517)   //"Edit Delete Frame" was chosen from menu
518)   private void actionEditDeleteFrame( )
519)   {
520)     int frameNo;
521) 
522)     //do nothing if there is no current frame
523)     if( curFrame == null )
524)       return;
525) 
526)     //delete current frame
527)     frameNo = scrollFrames.getValue( );
528)     curMovie.deleteFrame( frameNo );
529)     frameNo--;
530)     curMovieChanged = true;
531) 
532)     //update controls
533)     updateFrames( frameNo );
534)   }
535) 
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

536)   //"Edit Import Frame..." was chosen from menu
537)   private void actionEditImportFrame( )
538)   {
539)     JFileChooser fileChooser;
540)     ImageIcon icon;
541)     Image image;
542)     BufferedImage bufferedImage;
543)     BlinkenFrame frame;
544)     int width, height, x, y, frameCnt, frameNo;
545) 
546)     //show file select dialog
547)     fileChooser = new JFileChooser( );
548)     fileChooser.setDialogTitle( "Blimp - Import Frame..." );
549)     if( curDir != null )
550)       fileChooser.setCurrentDirectory( curDir );
551)     if( fileChooser.showOpenDialog( dialogParent ) != JFileChooser.APPROVE_OPTION ) //not successful
552)       return;
553)     //save current directory
554)     curDir = fileChooser.getCurrentDirectory( );
555) 
556)     //load image
557)     icon = new ImageIcon( fileChooser.getSelectedFile( ).getPath( ) );
558)     if( icon == null )
559)     {
560)       labelStatus.setText( "could not import frame from \"" + fileChooser.getSelectedFile( ).getPath( ) +  "\"..." );
561)       return;
562)     }
563)     width = icon.getIconWidth( );
564)     height = icon.getIconHeight( );
565)     image = icon.getImage( );
566)     if( width <= 0 || height <= 0 || image == null )
567)     {
568)       labelStatus.setText( "could not import frame from \"" + fileChooser.getSelectedFile( ).getPath( ) +  "\"..." );
569)       return;
570)     }
571)     //convert image to a buffered one
572)     bufferedImage = new BufferedImage( width, height, BufferedImage.TYPE_INT_ARGB );
573)     bufferedImage.getGraphics( ).drawImage( image, 0, 0, width, height, null );
574) 
575)     //create new empty frame
576)     frame = new BlinkenFrame( height, width,
577)                               curMovie.getChannels( ), curMovie.getMaxval( ), defDuration );
578)     height = frame.getHeight( ); //dimensions might have been invalid and thus been adapted
579)     width = frame.getWidth( );
580)     frame.clear( );
581) 
582)     //put pixels of image into frame
583)     for( y = 0; y < height; y++ )
584)       for( x = 0; x < width; x++ )
585)         frame.setColor( y, x, new Color( bufferedImage.getRGB( x, y ) ) );
586) 
587)     //insert frame behind current position
588)     frameCnt = curMovie.getFrameCnt( );
589)     frameNo = scrollFrames.getValue( ) + 1;
590)     if( frameNo < 0 )
591)       frameNo = 0;
592)     if( frameNo > frameCnt )
593)       frameNo = frameCnt;
594)     curMovie.insertFrame( frameNo, frame ); //this resizes the frame to fit the movie dimensions
595)     curMovieChanged = true;
596) 
597)     //show status message
598)     labelStatus.setText( "frame was sucessfully imported from \"" + fileChooser.getSelectedFile( ).getPath( ) +  "\"..." );
599) 
600)     //update controls
601)     updateFrames( frameNo );
602)   }
603) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

604)   //"Play Start" was chosen from menu
605)   private void actionPlayStart( )
606)   {
607)     //select no tool
608)     buttonToolsNone.setSelected( true );
609)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
610) 
611)     //disable start, enable stop
612)     menuPlayStart.setEnabled( false );
613)     menuPlayStop.setEnabled( true );
614) 
615)     //stop old play timer
616)     timerPlay.stop( );
617) 
618)     //if play shall start from beginning
619)     if( menuPlayBegin.getState( ) )
620)     {
621)       //show first frame
622)       if( scrollFrames.getValue( ) != 0 ) //value changes
623)         scrollFrames.setValue( 0 ); //play timer will be started again when frame is being shown by scrollbar callback
624)       else //value does not change
625)         stateFrames( ); //value does not change, no event will be sent, execute callback by hand
626)     }
627) 
628)     //start play timer
629)     if( curFrame == null )
630)       timerPlay.setInitialDelay( 100 ); //use 100ms as default
631)     else
632)       timerPlay.setInitialDelay( curFrame.getDuration( ) );
633)     timerPlay.restart( );
634)   }
635) 
636)   //"Play Stop" was chosen from menu
637)   private void actionPlayStop( )
638)   {
639)     //stop play timer
640)     timerPlay.stop( );
641) 
642)     //enable start, disable stop
643)     menuPlayStart.setEnabled( true );
644)     menuPlayStop.setEnabled( false );
645)   }
646) 
647)   //play timer elapsed
648)   private void actionPlayTimer( )
649)   {
650)     int frameCnt, frameNoOld, frameNoNew;
651) 
652)     //stop play timer
653)     timerPlay.stop( );
654) 
655)     //get number of next frame
656)     frameCnt = curMovie.getFrameCnt( );
657)     frameNoOld = scrollFrames.getValue( );
658)     frameNoNew = frameNoOld + 1;
659)     if( frameNoNew >= frameCnt )
660)     {
661)       frameNoNew = 0;
662)       //stop playing if looping is not requested
663)       if( ! menuPlayLoop.getState( ) )
664)       {
665)         //enable start, disable stop
666)         menuPlayStart.setEnabled( true );
667)         menuPlayStop.setEnabled( false );
668)         return;
669)       }
670)     }
671) 
672)     //show next frame
673)     if( frameNoNew != frameNoOld ) //value changes
674)       scrollFrames.setValue( frameNoNew ); //play timer will be started again when frame is being shown by scrollbar callback
675)     else //value does not change
676)       stateFrames( ); //value does not change, no event will be sent, execute callback by hand
677)   }
678) 
679)   //"Help About" was chosen from menu
680)   private void actionHelpAbout( )
681)   {
682)     JOptionPane.showMessageDialog( dialogParent,
683)                                    "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

684)                                    "version 0.6 date 2005-03-10\n" +
685)                                    "Copyright (C) 2004-2005: Stefan Schuermans <1stein@schuermans.info>\n" +
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

686)                                    "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
687)                                    "a blinkenarea.org project\n" +
688)                                    "powered by eventphone.de",
689)                                    "Blimp - About...",
690)                                    JOptionPane.INFORMATION_MESSAGE );
691)   }
692) 
693)   //update frames controls (and go to certaint frame)
694)   private void updateFrames( int frameNo )
695)   {
696)     int frameCnt, frameInc;
697) 
698)     //update frames scrollbar range
699)     frameCnt = curMovie.getFrameCnt( );
700)     if( frameCnt <= 0 )
701)     {
702)       scrollFrames.setValues( 0, 0, 0, 0 );
703)       scrollFrames.setBlockIncrement( 1 );
704)     }
705)     else
706)     {
707)       if( frameNo < 0 )
708)         frameNo = 0;
709)       if( frameNo >= frameCnt )
710)         frameNo = frameCnt - 1;
711)       scrollFrames.setValues( frameNo, 1, 0, frameCnt );
712)       frameInc = (int)Math.sqrt( frameCnt );
713)       if( frameInc < 1 )
714)         frameInc = 1;
715)       scrollFrames.setBlockIncrement( frameInc );
716)     }
717) 
718)     //simulate frames scrollbar change to propagate update
719)     stateFrames( );
720) 
721)     //enable disable some menu commands which need a current frame
722)     menuEditDuplicateFrame.setEnabled( frameCnt > 0 );
723)     menuEditDeleteFrame.setEnabled( frameCnt > 0 );
724)   }
725) 
726)   //frames scrollbar changed
727)   private void stateFrames( )
728)   {
729)     int frameCnt, frameNo;
730) 
731)     //update frames scrollbar label
732)     //get current frame
733)     frameCnt = curMovie.getFrameCnt( );
734)     if( frameCnt <= 0 )
735)     {
736)       labelFrames.setText( "frame: -/0" );
737)       curFrame = null;
738)     }
739)     else
740)     {
741)       frameNo = scrollFrames.getValue( );
742)       labelFrames.setText( "frame: " + (frameNo + 1) + "/" + frameCnt );
743)       curFrame = curMovie.getFrame( frameNo );
744)     }
745) 
746)     //update frame
747)     frameEditor.setFrame( curFrame );
748) 
749)     //show duration
750)     showDuration( );
751) 
752)     //if currently playing
753)     if( ! menuPlayStart.isEnabled( ) )
754)     {
755)       //stop play timer
756)       timerPlay.stop( );
757)       //start play timer
758)       if( curFrame == null )
759)         timerPlay.setInitialDelay( 100 ); //use 100ms as default
760)       else
761)         timerPlay.setInitialDelay( curFrame.getDuration( ) );
762)       timerPlay.restart( );
763)     }
764)   }
765) 
766)   //frame zoom changed
767)   private void stateFrameZoom( )
768)   {
769)     //update frame
770)     frameEditor.setZoom( sliderFrameZoom.getValue( ) );
771)   }
772) 
773)   //show duration
774)   private void showDuration( )
775)   {
776)     if( curFrame == null )
777)     {
778)       textDuration.setEnabled( false );
779)       textDuration.setText( "" );
780)     }
781)     else
782)     {
783)       textDuration.setEnabled( true );
784)       textDuration.setText( "" + curFrame.getDuration( ) );
785)     }
786)   }
787) 
788)   //new frame duration is being entered
789)   private void changeDuration( )
790)   {
791)     int duration;
792) 
793)     try
794)     {
795)       //get new frame duration
796)       duration = Integer.parseInt( textDuration.getText( ) );
797) 
798)       //write new duration into frame (if it really changed)
799)       if( curFrame != null && curFrame.getDuration( ) != duration )
800)       {
801)         curFrame.setDuration( duration );
802)         curMovieChanged = true;
803)       }
804)     }
805)     catch( NumberFormatException e ) { }
806)   }
807) 
808)   //new frame duration was entered
809)   private void validateDuration( )
810)   {
811)     //process changes made to duration
812)     changeDuration( );
813) 
814)     //redisplay new duration
815)     showDuration( );
816)   }
817) 
818)   //generate a color icon from a color
819)   private void iconFromColor( ImageIcon icon, Color color )
820)   {
821)     int height, width, y, x;
822)     boolean yy, xx;
823)     Graphics graphics;
824) 
825)     //get size
826)     height = icon.getIconHeight( );
827)     width = icon.getIconWidth( );
828) 
829)     //get graphics context of icon's image
830)     graphics = icon.getImage( ).getGraphics( );
831) 
832)     //draw background
833)     graphics.setColor( new Color( color.getRed( ), color.getGreen( ), color.getBlue( ) ) );
834)     graphics.fillRect( 0, 0, width / 2, height );
835)     for( y = 0, yy = false; y < height; y += height / 4, yy = ! yy )
836)     {
837)       for( x = width / 2, xx = yy; x < width; x += width / 6, xx = ! xx )
838)       {
839)         if( xx )
840)           graphics.setColor( Color.white );
841)         else
842)           graphics.setColor( Color.black );
843)         graphics.fillRect( x, y, width / 6, height / 4 );
844)       }
845)     }
846) 
847)     //draw foreground in specified color
848)     graphics.setColor( color );
849)     graphics.fillRect( 0, 0, width, height );
850)   }
851) 
852)   //a color was chosen
853)   private void actionColorIdx( int idx )
854)   {
855)     //click on active color
856)     if( idx == colorIdx )
857)     {
858)       //act as if color color select button was pressed
859)       actionColorsColor( );
860)       return;
861)     }
862) 
863)     //set active color index
864)     colorIdx = idx;
865) 
866)     //update color settings
867)     showColorsColor( );
868)     showColorsAlpha( );
869) 
870)     //set color of frame editor to new color
871)     frameEditor.setColor( colors[colorIdx] );
872)   }
873) 
874)   //show color
875)   private void showColorsColor( )
876)   {
877)     int red, green, blue;
878)     String hex;
879) 
880)     //get color components
881)     red = colors[colorIdx].getRed( );
882)     green = colors[colorIdx].getGreen( );
883)     blue = colors[colorIdx].getBlue( );
884) 
885)     //color button
886)     iconFromColor( iconColorsColor, new Color( red, green, blue ) );
887)     buttonColorsColor.repaint( );
888) 
889)     //color text
890)     if( red < 0x10 )
891)       hex = "0" + Integer.toHexString( red );
892)     else
893)       hex = Integer.toHexString( red );
894)     if( green < 0x10 )
895)       hex += "0" + Integer.toHexString( green );
896)     else
897)       hex += Integer.toHexString( green );
898)     if( blue < 0x10 )
899)       hex += "0" + Integer.toHexString( blue );
900)     else
901)       hex += Integer.toHexString( blue );
902)     textColorsColor.setText( hex.toUpperCase( ) );
903)   }
904) 
905)   //color select button was pressed
906)   private void actionColorsColor( )
907)   {
908)     Color color;
909) 
910)     //get current color with full alpha
911)     color = new Color( colors[colorIdx].getRed( ),
912)                        colors[colorIdx].getGreen( ),
913)                        colors[colorIdx].getBlue( ) );
914)     
915)     //show color select dialog
916)     color = JColorChooser.showDialog( dialogParent,
917)                                       "Blimp - Choose Color...",
918)                                       color );
919)     if( color == null ) //dialog was cancelled
920)       return;
921) 
922)     //save new color
923)     colors[colorIdx] = new Color( color.getRed( ),
924)                                   color.getGreen( ),
925)                                   color.getBlue( ),
926)                                   colors[colorIdx].getAlpha( ) );
927) 
928)     //redisplay new color
929)     showColorsColor( );
930) 
931)     //update color icon of active color
932)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
933)     buttonsColor[colorIdx].repaint( );
934) 
935)     //set color of frame editor to new color
936)     frameEditor.setColor( colors[colorIdx] );
937)   }
938) 
939)   //new color text is being entered
940)   private void changeColorsColor( )
941)   {
942)     String txt;
943)     int red, green, blue;
944) 
945)     //get color text
946)     txt = textColorsColor.getText( );
947) 
948)     //standard color is black
949)     red = 0;
950)     green = 0;
951)     blue = 0;
952) 
953)     //get new color
954)     try
955)     {
956)       if( txt.length( ) >= 2 )
957)         red = Integer.parseInt( txt.substring( 0, 2 ), 0x10 );
958)       if( txt.length( ) >= 4 )
959)         green = Integer.parseInt( txt.substring( 2, 4 ), 0x10 );
960)       if( txt.length( ) >= 6 )
961)         blue = Integer.parseInt( txt.substring( 4, 6 ), 0x10 );
962)     }
963)     catch( NumberFormatException e ) { }
964) 
965)     //save new color
966)     colors[colorIdx] = new Color( red, green, blue, colors[colorIdx].getAlpha( ) );
967) 
968)     //set color of frame editor to new color
969)     frameEditor.setColor( colors[colorIdx] );
970)   }
971) 
972)   //new color text was entered
973)   private void validateColorsColor( )
974)   {
975)     //process changes
976)     changeColorsColor( );
977) 
978)     //redisplay new color
979)     showColorsColor( );
980) 
981)     //update color icon of active color
982)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
983)     buttonsColor[colorIdx].repaint( );
984)   }
985) 
986)   //show color's alpha value
987)   private void showColorsAlpha( )
988)   {
989)     int alpha;
990)     String hex;
991) 
992)     //get alpha value
993)     alpha = colors[colorIdx].getAlpha( );
994) 
995)     //alpha slider
996)     sliderColorsAlpha.setValue( alpha );
997) 
998)     //alpha text
999)     if( alpha < 0x10 )
1000)       hex = "0" + Integer.toHexString( alpha );
1001)     else
1002)       hex = Integer.toHexString( alpha );
1003)     textColorsAlpha.setText( hex.toUpperCase( ) );
1004)   }
1005) 
1006)   //color's alpha value changed
1007)   private void stateColorsAlpha( )
1008)   {
1009)     int alpha;
1010)     String hex;
1011) 
1012)     //get new alpha value
1013)     alpha = sliderColorsAlpha.getValue( );
1014) 
1015)     //update active color
1016)     colors[colorIdx] = new Color( colors[colorIdx].getRed( ),
1017)                                   colors[colorIdx].getGreen( ),
1018)                                   colors[colorIdx].getBlue( ),
1019)                                   alpha );
1020) 
1021)     //update alpha text
1022)     if( alpha < 0x10 )
1023)       hex = "0" + Integer.toHexString( alpha );
1024)     else
1025)       hex = Integer.toHexString( alpha );
1026)     textColorsAlpha.setText( hex.toUpperCase( ) );
1027) 
1028)     //update color icon of active color
1029)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1030)     buttonsColor[colorIdx].repaint( );
1031) 
1032)     //set color of frame editor to new color
1033)     frameEditor.setColor( colors[colorIdx] );
1034)   }
1035) 
1036)   //new alpha text is being entered
1037)   private void changeColorsAlpha( )
1038)   {
1039)     String txt;
1040)     int alpha;
1041) 
1042)     //get alpha text
1043)     txt = textColorsAlpha.getText( );
1044) 
1045)     //standard alpha is full
1046)     alpha = 255;
1047) 
1048)     //get new alpha
1049)     try
1050)     {
1051)       if( txt.length( ) >= 2 )
1052)         alpha = Integer.parseInt( txt.substring( 0, 2 ), 0x10 );
1053)     }
1054)     catch( NumberFormatException e ) { }
1055) 
1056)     //save new alpha
1057)     colors[colorIdx] = new Color( colors[colorIdx].getRed( ),
1058)                                   colors[colorIdx].getGreen( ),
1059)                                   colors[colorIdx].getBlue( ),
1060)                                   alpha );
1061) 
1062)     //set color of frame editor to new color
1063)     frameEditor.setColor( colors[colorIdx] );
1064)   }
1065) 
1066)   //new alpha text was entered
1067)   private void validateColorsAlpha( )
1068)   {
1069)     //process changes
1070)     changeColorsAlpha( );
1071) 
1072)     //redisplay new alpha value
1073)     showColorsAlpha( );
1074) 
1075)     //update color icon of active color
1076)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1077)     buttonsColor[colorIdx].repaint( );
1078)   }
1079) 
1080)   public void windowActivated( WindowEvent e )
1081)   {
1082)   }
1083) 
1084)   public void windowDeactivated( WindowEvent e )
1085)   {
1086)   }
1087) 
1088)   public void windowOpened( WindowEvent e )
1089)   {
1090)   }
1091) 
1092)   public void windowClosing( WindowEvent e )
1093)   {
1094)     actionFileQuit( ); //act as "File Quit"
1095)   }
1096) 
1097)   public void windowClosed( WindowEvent e )
1098)   { 
1099)   }
1100) 
1101)   public void windowIconified( WindowEvent e )
1102)   {
1103)   }
1104) 
1105)   public void windowDeiconified( WindowEvent e )
1106)   {
1107)   }
1108) 
1109)   //some GUI action was perfomed
1110)   public void actionPerformed( ActionEvent e )
1111)   {
1112)     int i;
1113) 
1114)     if( e.getSource( ) == menuFileNew )
1115)       actionFileNew( );
1116)     else if( e.getSource( ) == menuFileLoad )
1117)       actionFileLoad( );
1118)     else if( e.getSource( ) == menuFileSave )
1119)       actionFileSave( );
1120)     else if( e.getSource( ) == menuFileSaveAs )
1121)       actionFileSaveAs( );
1122)     else if( e.getSource( ) == menuFileQuit )
1123)       actionFileQuit( );
1124)     else if( e.getSource( ) == menuInfoShow )
1125)       actionInfoShow( );
1126)     else if( e.getSource( ) == menuInfoAdd )
1127)       actionInfoAdd( );
1128)     else if( e.getSource( ) == menuInfoDelete )
1129)       actionInfoDelete( );
1130)     else if( e.getSource( ) == menuEditResize )
1131)       actionEditResize( );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1132)     else if( e.getSource( ) == menuEditScale )
1133)       actionEditScale( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1134)     else if( e.getSource( ) == menuEditInsertFrame )
1135)       actionEditInsertFrame( );
1136)     else if( e.getSource( ) == menuEditDuplicateFrame )
1137)       actionEditDuplicateFrame( );
1138)     else if( e.getSource( ) == menuEditDeleteFrame )
1139)       actionEditDeleteFrame( );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1140)     else if( e.getSource( ) == menuEditImportFrame )
1141)       actionEditImportFrame( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1142)     else if( e.getSource( ) == menuPlayStart )
1143)       actionPlayStart( );
1144)     else if( e.getSource( ) == menuPlayStop )
1145)       actionPlayStop( );
1146)     else if( e.getSource( ) == timerPlay )
1147)       actionPlayTimer( );
1148)     else if( e.getSource( ) == menuHelpAbout )
1149)       actionHelpAbout( );
1150)     else if( e.getSource( ) == textDuration )
1151)       validateDuration( );
1152)     else if( e.getSource( ) == buttonToolsNone )
1153)       frameEditor.setTool( BlinkenFrameEditor.toolNone );
1154)     else if( e.getSource( ) == buttonToolsColorPicker )
1155)       frameEditor.setTool( BlinkenFrameEditor.toolColorPicker );
1156)     else if( e.getSource( ) == buttonToolsDot )
1157)       frameEditor.setTool( BlinkenFrameEditor.toolDot );
1158)     else if( e.getSource( ) == buttonToolsLine )
1159)       frameEditor.setTool( BlinkenFrameEditor.toolLine );
1160)     else if( e.getSource( ) == buttonToolsRect )
1161)       frameEditor.setTool( BlinkenFrameEditor.toolRect );
1162)     else if( e.getSource( ) == buttonToolsFilledRect )
1163)       frameEditor.setTool( BlinkenFrameEditor.toolFilledRect );
1164)     else if( e.getSource( ) == buttonToolsCircle )
1165)       frameEditor.setTool( BlinkenFrameEditor.toolCircle );
1166)     else if( e.getSource( ) == buttonToolsFilledCircle )
1167)       frameEditor.setTool( BlinkenFrameEditor.toolFilledCircle );
1168)     else if( e.getSource( ) == buttonToolsCopy )
1169)       frameEditor.setTool( BlinkenFrameEditor.toolCopy );
1170)     else if( e.getSource( ) == buttonToolsPaste )
1171)       frameEditor.setTool( BlinkenFrameEditor.toolPaste );
1172)     else if( e.getSource( ) == buttonActionsInvert )
1173)       frameEditor.actionInvert( );
1174)     else if( e.getSource( ) == buttonActionsRotate90 )
1175)       frameEditor.actionRotate90( );
1176)     else if( e.getSource( ) == buttonActionsRotate180 )
1177)       frameEditor.actionRotate180( );
1178)     else if( e.getSource( ) == buttonActionsRotate270 )
1179)       frameEditor.actionRotate270( );
1180)     else if( e.getSource( ) == buttonActionsMirrorHor )
1181)       frameEditor.actionMirrorHor( );
1182)     else if( e.getSource( ) == buttonActionsMirrorVer )
1183)       frameEditor.actionMirrorVer( );
1184)     else if( e.getSource( ) == buttonActionsMirrorDiag )
1185)       frameEditor.actionMirrorDiag( );
1186)     else if( e.getSource( ) == buttonActionsMirrorDiag2 )
1187)       frameEditor.actionMirrorDiag2( );
1188)     else if( e.getSource( ) == buttonActionsRollLeft )
1189)       frameEditor.actionRollLeft( );
1190)     else if( e.getSource( ) == buttonActionsRollRight )
1191)       frameEditor.actionRollRight( );
1192)     else if( e.getSource( ) == buttonActionsRollUp )
1193)       frameEditor.actionRollUp( );
1194)     else if( e.getSource( ) == buttonActionsRollDown )
1195)       frameEditor.actionRollDown( );
1196)     else if( e.getSource( ) == buttonActionsUndo )
1197)       frameEditor.actionUndo( );
1198)     else if( e.getSource( ) == buttonActionsRedo )
1199)       frameEditor.actionRedo( );
1200)     else if( e.getSource( ) == buttonColorsColor )
1201)       actionColorsColor( );
1202)     else if( e.getSource( ) == textColorsColor )
1203)       validateColorsColor( );
1204)     else if( e.getSource( ) == textColorsAlpha )
1205)       validateColorsAlpha( );
1206)     else
1207)     {
1208)       for( i = 0; i < constColorCnt; i++ )
1209)         if( e.getSource( ) == buttonsColor[i] )
1210)           break;
1211)       if( i < constColorCnt )
1212)         actionColorIdx( i );
1213)     }
1214)   }
1215) 
1216)   //some GUI value was adjusted
1217)   public void adjustmentValueChanged( AdjustmentEvent e )
1218)   {
1219)     if( e.getSource( ) == scrollFrames )
1220)       stateFrames( );
1221)   }
1222) 
1223)   //some GUI state changed
1224)   public void stateChanged( ChangeEvent e )
1225)   {
1226)     if( e.getSource( ) == sliderFrameZoom )
1227)       stateFrameZoom( );
1228)     else if( e.getSource( ) == sliderColorsAlpha )
1229)       stateColorsAlpha( );
1230)   }
1231) 
1232)   //a control got the focus
1233)   public void focusGained( FocusEvent e )
1234)   {
1235)   }
1236) 
1237)   //a control lost the focus
1238)   public void focusLost( FocusEvent e )
1239)   {
1240)     if( e.getSource( ) == textDuration )
1241)       validateDuration( );
1242)     else if( e.getSource( ) == textColorsColor )
1243)       validateColorsColor( );
1244)     else if( e.getSource( ) == textColorsAlpha )
1245)       validateColorsAlpha( );
1246)   }
1247) 
1248)   //something was changed in a document
1249)   public void changedUpdate( DocumentEvent e )
1250)   {
1251)     if( e.getDocument( ) == textDuration.getDocument( ) )
1252)       changeDuration( );
1253)     else if( e.getDocument( ) == textColorsColor.getDocument( ) )
1254)       changeColorsColor( );
1255)     else if( e.getDocument( ) == textColorsAlpha.getDocument( ) )
1256)       changeColorsAlpha( );
1257)   }
1258) 
1259)   //something was inserted into a document
1260)   public void insertUpdate( DocumentEvent e )
1261)   {
1262)     if( e.getDocument( ) == textDuration.getDocument( ) )
1263)       changeDuration( );
1264)   }
1265) 
1266)   //something was removed from a document
1267)   public void removeUpdate( DocumentEvent e )
1268)   {
1269)     if( e.getDocument( ) == textDuration.getDocument( ) )
1270)       changeDuration( );
1271)   }
1272) 
1273)   //info text of frame editor changed
1274)   public void blinkenFrameEditorInfo( String info )
1275)   {
1276)     labelFrameInfo.setText( info );
1277)   }
1278) 
1279)   //a color was picked in the frame editor
1280)   public void blinkenFrameEditorColorPicked( Color color )
1281)   {
1282)     //save new color
1283)     colors[colorIdx] = color;
1284) 
1285)     //redisplay new color (incl. alpha)
1286)     showColorsColor( );
1287)     showColorsAlpha( );
1288) 
1289)     //update color icon of active color
1290)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1291)     buttonsColor[colorIdx].repaint( );
1292) 
1293)     //set color of frame editor to new color
1294)     frameEditor.setColor( colors[colorIdx] );
1295)   }
1296) 
1297)   //the current frame was changed in the frame editor
1298)   public void blinkenFrameEditorFrameChanged( )
1299)   {
1300)     curMovieChanged = true;
1301)   }
1302) 
1303)   //the possibility to perfon an undo or redo operation changed
1304)   public void blinkenFrameEditorCanUndoRedo( boolean canUndo, boolean canRedo )
1305)   {
1306)     buttonActionsUndo.setEnabled( canUndo );
1307)     buttonActionsRedo.setEnabled( canRedo );
1308)   }
1309) 
1310)   //entry point of main thread
1311)   public void run( )
1312)   {
1313)     int i, val;
1314)     Dimension size;
1315)     Insets smallMargin;
1316) 
1317)     //initialize current movie, frame
1318)     curDir = new File( "." );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1319)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1320)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.6 date 2005-03-10)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1321)     curMovie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1322)     curFrame = null;
1323) 
1324)     //runnning as full application
1325)     if( isFullApp )
1326)     {
1327)       //create main window
1328)       JFrame.setDefaultLookAndFeelDecorated( true );
1329)       frame = new JFrame( "Blimp" );
1330)       frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
1331)       frame.addWindowListener( this );
1332)       //create menu bar
1333)       menubar = new JMenuBar( );
1334)       frame.setJMenuBar( menubar );
1335)       //create main panel
1336)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1337)       frame.getContentPane( ).add( panel );
1338)       //use main window as parent for dialogs
1339)       dialogParent = frame;
1340)     }
1341)     //runnning as applet
1342)     else
1343)     {
1344)       //no main window - applet is main window
1345)       frame = null;
1346)       //create menu bar
1347)       menubar = new JMenuBar( );
1348)       setJMenuBar( menubar );
1349)       //create main panel
1350)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1351)       getContentPane( ).add( panel );
1352)       //use applet as parent for dialogs
1353)       dialogParent = this;
1354)     }
1355) 
1356)     //create menus
1357)     //file menu
1358)     menuFile = new JMenu( "File" );
1359)     menubar.add( menuFile );
1360)     menuFileNew = new JMenuItem( "New" );
1361)     menuFileNew.addActionListener( this );
1362)     menuFile.add( menuFileNew );
1363)     menuFileLoad = new JMenuItem( "Load..." );
1364)     menuFileLoad.addActionListener( this );
1365)     menuFile.add( menuFileLoad );
1366)     menuFileSave = new JMenuItem( "Save" );
1367)     menuFileSave.addActionListener( this );
1368)     menuFile.add( menuFileSave );
1369)     menuFileSaveAs = new JMenuItem( "Save as..." );
1370)     menuFileSaveAs.addActionListener( this );
1371)     menuFile.add( menuFileSaveAs );
1372)     if( isFullApp )
1373)       menuFile.addSeparator( );
1374)     menuFileQuit = new JMenuItem( "Quit" );
1375)     menuFileQuit.addActionListener( this );
1376)     if( isFullApp )
1377)       menuFile.add( menuFileQuit );
1378)     //information menu
1379)     menuInfo = new JMenu( "Information" );
1380)     menubar.add( menuInfo );
1381)     menuInfoShow = new JMenuItem( "Show..." );
1382)     menuInfoShow.addActionListener( this );
1383)     menuInfo.add( menuInfoShow );
1384)     menuInfoAdd = new JMenuItem( "Add..." );
1385)     menuInfoAdd.addActionListener( this );
1386)     menuInfo.add( menuInfoAdd );
1387)     menuInfoDelete = new JMenuItem( "Delete..." );
1388)     menuInfoDelete.addActionListener( this );
1389)     menuInfo.add( menuInfoDelete );
1390)     //edit menu
1391)     menuEdit = new JMenu( "Edit" );
1392)     menubar.add( menuEdit );
1393)     menuEditResize = new JMenuItem( "Resize Movie..." );
1394)     menuEditResize.addActionListener( this );
1395)     menuEdit.add( menuEditResize );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1396)     menuEditScale = new JMenuItem( "Scale Movie..." );
1397)     menuEditScale.addActionListener( this );
1398)     menuEdit.add( menuEditScale );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1399)     menuEdit.addSeparator( );
1400)     menuEditInsertFrame = new JMenuItem( "Insert Frame" );
1401)     menuEditInsertFrame.addActionListener( this );
1402)     menuEdit.add( menuEditInsertFrame );
1403)     menuEditDuplicateFrame = new JMenuItem( "Duplicate Frame" );
1404)     menuEditDuplicateFrame.setEnabled( false );
1405)     menuEditDuplicateFrame.addActionListener( this );
1406)     menuEdit.add( menuEditDuplicateFrame );
1407)     menuEditDeleteFrame = new JMenuItem( "Delete Frame" );
1408)     menuEditDeleteFrame.setEnabled( false );
1409)     menuEditDeleteFrame.addActionListener( this );
1410)     menuEdit.add( menuEditDeleteFrame );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1411)     menuEdit.addSeparator( );
1412)     menuEditImportFrame = new JMenuItem( "Import Frame..." );
1413)     menuEditImportFrame.addActionListener( this );
1414)     menuEdit.add( menuEditImportFrame );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1415)     //play menu
1416)     menuPlay = new JMenu( "Play" );
1417)     menubar.add( menuPlay );
1418)     menuPlayStart = new JMenuItem( "Start" );
1419)     menuPlayStart.addActionListener( this );
1420)     menuPlay.add( menuPlayStart );
1421)     menuPlayStop = new JMenuItem( "Stop" );
1422)     menuPlayStop.setEnabled( false );
1423)     menuPlayStop.addActionListener( this );
1424)     menuPlay.add( menuPlayStop );
1425)     menuPlay.addSeparator( );
1426)     menuPlayBegin = new JCheckBoxMenuItem( "From Begin", false );
1427)     menuPlayBegin.addActionListener( this );
1428)     menuPlay.add( menuPlayBegin );
1429)     menuPlayLoop = new JCheckBoxMenuItem( "Looped", false );
1430)     menuPlayLoop.addActionListener( this );
1431)     menuPlay.add( menuPlayLoop );
1432)     //help menu
1433)     menuHelp = new JMenu( "Help" );
1434)     menubar.add( menuHelp );
1435)     menuHelpAbout = new JMenuItem( "About..." );
1436)     menuHelpAbout.addActionListener( this );
1437)     menuHelp.add( menuHelpAbout );
1438) 
1439)     //create controls
1440)     smallMargin = new Insets( 1, 1, 1, 1 );
1441)     panel.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
1442)     //status bar
1443)     panelStatus = new JPanel( new BorderLayout( 5, 5 ) );
1444)     panel.add( panelStatus, BorderLayout.SOUTH );
1445)     panelStatus.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.NORTH );
1446)     labelStatus = new JLabel( "ready..." );
1447)     panelStatus.add( labelStatus, BorderLayout.CENTER );
1448)     //main panel
1449)     panelMain = new JPanel( new BorderLayout( 5, 5 ) );
1450)     panel.add( panelMain, BorderLayout.CENTER );
1451)     //frames panel
1452)     panelFrames = new JPanel( new BorderLayout( 5, 5 ) );
1453)     panelMain.add( panelFrames, BorderLayout.SOUTH );
1454)     scrollFrames = new JScrollBar( SwingConstants.HORIZONTAL, 0, 0, 0, 0 );
1455)     scrollFrames.setBlockIncrement( 1 );
1456)     scrollFrames.addAdjustmentListener( this );
1457)     panelFrames.add( scrollFrames, BorderLayout.CENTER );
1458)     labelFrames = new JLabel( "frame: -/0" );
1459)     labelFrames.setLabelFor( scrollFrames );
1460)     panelFrames.add( labelFrames, BorderLayout.WEST );
1461)     //outer and middle frame panel
1462)     panelOuterFrame = new JPanel( new BorderLayout( 5, 5 ) );
1463)     panelMain.add( panelOuterFrame, BorderLayout.CENTER );
1464)     panelOuterFrame.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1465)     panelMiddleFrame = new JPanel( new BorderLayout( 5, 5 ) );
1466)     panelOuterFrame.add( panelMiddleFrame, BorderLayout.CENTER );
1467)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.WEST );
1468)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.EAST );
1469)     //frame panel
1470)     panelFrame = new JPanel( new BorderLayout( 5, 5 ) );
1471)     panelMiddleFrame.add( panelFrame, BorderLayout.CENTER );
1472)     sliderFrameZoom = new JSlider( JSlider.VERTICAL, 0, 6, 3 );
1473)     sliderFrameZoom.setSnapToTicks( true );
1474)     sliderFrameZoom.setInverted( true );
1475)     sliderFrameZoom.addChangeListener( this );
1476)     sliderFrameZoom.setToolTipText( "Zoom" );
1477)     panelFrame.add( sliderFrameZoom, BorderLayout.EAST );
1478)     frameEditor = new BlinkenFrameEditor( );
1479)     frameEditor.setZoom( sliderFrameZoom.getValue( ) );
1480)     scrollpaneFrame = new JScrollPane( frameEditor );
1481)     panelFrame.add( scrollpaneFrame, BorderLayout.CENTER );
1482)     labelFrameInfo = new JLabel( "", JLabel.CENTER );
1483)     labelFrameInfo.setLabelFor( frameEditor );
1484)     panelFrame.add( labelFrameInfo, BorderLayout.NORTH );
1485)     frameEditor.setEditorListener( this );
1486)     panelDuration = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 5 ) );
1487)     panelFrame.add( panelDuration, BorderLayout.SOUTH );
1488)     textDuration = new JTextField( 5 );
1489)     textDuration.setHorizontalAlignment( JTextField.CENTER );
1490)     textDuration.setEnabled( false );
1491)     textDuration.getDocument( ).addDocumentListener( this );
1492)     textDuration.addActionListener( this );
1493)     textDuration.addFocusListener( this );
1494)     labelDuration = new JLabel( "duration (ms): " );
1495)     labelDuration.setLabelFor( textDuration );
1496)     panelDuration.add( labelDuration );
1497)     panelDuration.add( textDuration );
1498)     //tool and action panels
1499)     panelOuterTools = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
1500)     panelOuterFrame.add( panelOuterTools, BorderLayout.WEST );
1501)     panelMiddleTools = new JPanel( new BorderLayout( 5, 5 ) );
1502)     panelOuterTools.add( panelMiddleTools );
1503)     panelTools = new JPanel( new GridLayout( 4, 3, 5, 5 ) );
1504)     panelMiddleTools.add( panelTools, BorderLayout.CENTER );
1505)     panelMiddleTools.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1506)     panelActions = new JPanel( new GridLayout( 5, 3, 5, 5 ) );
1507)     panelOuterTools.add( panelActions );
1508)     //tool buttons
1509)     groupTools = new ButtonGroup( );
1510)     buttonToolsNone = new JToggleButton( );
1511)     buttonToolsNone.setMargin( smallMargin );
1512)     buttonToolsNone.setToolTipText( "no tool" );
1513)     buttonToolsNone.addActionListener( this );
1514)     groupTools.add( buttonToolsNone );
1515)     panelTools.add( buttonToolsNone );
1516)     buttonToolsColorPicker = new JToggleButton( loadImageIcon( "ColorPicker.png" ) );
1517)     buttonToolsColorPicker.setMargin( smallMargin );
1518)     buttonToolsColorPicker.setToolTipText( "Color Picker" );
1519)     buttonToolsColorPicker.addActionListener( this );
1520)     groupTools.add( buttonToolsColorPicker );
1521)     panelTools.add( buttonToolsColorPicker );
1522)     buttonToolsDot = new JToggleButton( loadImageIcon( "Dot.png" ) );
1523)     buttonToolsDot.setMargin( smallMargin );
1524)     buttonToolsDot.setToolTipText( "Dot" );
1525)     buttonToolsDot.addActionListener( this );
1526)     groupTools.add( buttonToolsDot );
1527)     panelTools.add( buttonToolsDot );
1528)     buttonToolsLine = new JToggleButton( loadImageIcon( "Line.png" ) );
1529)     buttonToolsLine.setMargin( smallMargin );
1530)     buttonToolsLine.setToolTipText( "Line" );
1531)     buttonToolsLine.addActionListener( this );
1532)     groupTools.add( buttonToolsLine );
1533)     panelTools.add( buttonToolsLine );
1534)     buttonToolsRect = new JToggleButton( loadImageIcon( "Rectangle.png" ) );
1535)     buttonToolsRect.setMargin( smallMargin );
1536)     buttonToolsRect.setToolTipText( "Rectangle" );
1537)     buttonToolsRect.addActionListener( this );
1538)     groupTools.add( buttonToolsRect );
1539)     panelTools.add( buttonToolsRect );
1540)     buttonToolsFilledRect = new JToggleButton( loadImageIcon( "FilledRectangle.png" ) );
1541)     buttonToolsFilledRect.setMargin( smallMargin );
1542)     buttonToolsFilledRect.setToolTipText( "Filled Rectangle" );
1543)     buttonToolsFilledRect.addActionListener( this );
1544)     groupTools.add( buttonToolsFilledRect );
1545)     panelTools.add( buttonToolsFilledRect );
1546)     panelTools.add( new JLabel( ) );
1547)     buttonToolsCircle = new JToggleButton( loadImageIcon( "Circle.png" ) );
1548)     buttonToolsCircle.setMargin( smallMargin );
1549)     buttonToolsCircle.setToolTipText( "Circle" );
1550)     buttonToolsCircle.addActionListener( this );
1551)     groupTools.add( buttonToolsCircle );
1552)     panelTools.add( buttonToolsCircle );
1553)     buttonToolsFilledCircle = new JToggleButton( loadImageIcon( "FilledCircle.png" ) );
1554)     buttonToolsFilledCircle.setMargin( smallMargin );
1555)     buttonToolsFilledCircle.setToolTipText( "Filled Circle" );
1556)     buttonToolsFilledCircle.addActionListener( this );
1557)     groupTools.add( buttonToolsFilledCircle );
1558)     panelTools.add( buttonToolsFilledCircle );
1559)     panelTools.add( new JLabel( ) );
1560)     buttonToolsCopy = new JToggleButton( loadImageIcon( "Copy.png" ) );
1561)     buttonToolsCopy.setMargin( smallMargin );
1562)     buttonToolsCopy.setToolTipText( "Copy" );
1563)     buttonToolsCopy.addActionListener( this );
1564)     groupTools.add( buttonToolsCopy );
1565)     panelTools.add( buttonToolsCopy );
1566)     buttonToolsPaste = new JToggleButton( loadImageIcon( "Paste.png" ) );
1567)     buttonToolsPaste.setMargin( smallMargin );
1568)     buttonToolsPaste.setToolTipText( "Paste" );
1569)     buttonToolsPaste.addActionListener( this );
1570)     groupTools.add( buttonToolsPaste );
1571)     panelTools.add( buttonToolsPaste );
1572)     buttonToolsNone.setSelected( true );
1573)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
1574)     //action buttons
1575)     buttonActionsInvert = new JButton( loadImageIcon( "Invert.png" ) );
1576)     buttonActionsInvert.setMargin( smallMargin );
1577)     buttonActionsInvert.setToolTipText( "Invert" );
1578)     buttonActionsInvert.addActionListener( this );
1579)     panelActions.add( buttonActionsInvert );
1580)     buttonActionsMirrorHor = new JButton( loadImageIcon( "MirrorHor.png" ) );
1581)     buttonActionsMirrorHor.setMargin( smallMargin );
1582)     buttonActionsMirrorHor.setToolTipText( "Mirror Horizontally" );
1583)     buttonActionsMirrorHor.addActionListener( this );
1584)     panelActions.add( buttonActionsMirrorHor );
1585)     buttonActionsRollLeft = new JButton( loadImageIcon( "RollLeft.png" ) );
1586)     buttonActionsRollLeft.setMargin( smallMargin );
1587)     buttonActionsRollLeft.setToolTipText( "Roll Left" );
1588)     buttonActionsRollLeft.addActionListener( this );
1589)     panelActions.add( buttonActionsRollLeft );
1590)     buttonActionsRotate90 = new JButton( loadImageIcon( "Rotate90.png" ) );
1591)     buttonActionsRotate90.setMargin( smallMargin );
1592)     buttonActionsRotate90.setToolTipText( "Rotate 90 Degrees" );
1593)     buttonActionsRotate90.addActionListener( this );
1594)     panelActions.add( buttonActionsRotate90 );
1595)     buttonActionsMirrorVer = new JButton( loadImageIcon( "MirrorVer.png" ) );
1596)     buttonActionsMirrorVer.setMargin( smallMargin );
1597)     buttonActionsMirrorVer.setToolTipText( "Mirror Vertically" );
1598)     buttonActionsMirrorVer.addActionListener( this );
1599)     panelActions.add( buttonActionsMirrorVer );
1600)     buttonActionsRollRight = new JButton( loadImageIcon( "RollRight.png" ) );
1601)     buttonActionsRollRight.setMargin( smallMargin );
1602)     buttonActionsRollRight.setToolTipText( "Roll Right" );
1603)     buttonActionsRollRight.addActionListener( this );
1604)     panelActions.add( buttonActionsRollRight );
1605)     buttonActionsRotate180 = new JButton( loadImageIcon( "Rotate180.png" ) );
1606)     buttonActionsRotate180.setMargin( smallMargin );
1607)     buttonActionsRotate180.setToolTipText( "Rotate 180 Degrees" );
1608)     buttonActionsRotate180.addActionListener( this );
1609)     panelActions.add( buttonActionsRotate180 );
1610)     buttonActionsMirrorDiag = new JButton( loadImageIcon( "MirrorDiag.png" ) );
1611)     buttonActionsMirrorDiag.setMargin( smallMargin );
1612)     buttonActionsMirrorDiag.setToolTipText( "Mirror Diagonally (\\)" );
1613)     buttonActionsMirrorDiag.addActionListener( this );
1614)     panelActions.add( buttonActionsMirrorDiag );
1615)     buttonActionsRollUp = new JButton( loadImageIcon( "RollUp.png" ) );
1616)     buttonActionsRollUp.setMargin( smallMargin );
1617)     buttonActionsRollUp.setToolTipText( "Roll Up" );
1618)     buttonActionsRollUp.addActionListener( this );
1619)     panelActions.add( buttonActionsRollUp );
1620)     buttonActionsRotate270 = new JButton( loadImageIcon( "Rotate270.png" ) );
1621)     buttonActionsRotate270.setMargin( smallMargin );
1622)     buttonActionsRotate270.setToolTipText( "Rotate 270 Degrees" );
1623)     buttonActionsRotate270.addActionListener( this );
1624)     panelActions.add( buttonActionsRotate270 );
1625)     buttonActionsMirrorDiag2 = new JButton( loadImageIcon( "MirrorDiag2.png" ) );
1626)     buttonActionsMirrorDiag2.setMargin( smallMargin );
1627)     buttonActionsMirrorDiag2.setToolTipText( "Mirror Diagonally (/)" );
1628)     buttonActionsMirrorDiag2.addActionListener( this );
1629)     panelActions.add( buttonActionsMirrorDiag2 );
1630)     buttonActionsRollDown = new JButton( loadImageIcon( "RollDown.png" ) );
1631)     buttonActionsRollDown.setMargin( smallMargin );
1632)     buttonActionsRollDown.setToolTipText( "Roll Down" );
1633)     buttonActionsRollDown.addActionListener( this );
1634)     panelActions.add( buttonActionsRollDown );
1635)     panelActions.add( new JLabel( ) );
1636)     buttonActionsUndo = new JButton( loadImageIcon( "Undo.png" ) );
1637)     buttonActionsUndo.setMargin( smallMargin );
1638)     buttonActionsUndo.setToolTipText( "Undo" );
1639)     buttonActionsUndo.setEnabled( false );
1640)     buttonActionsUndo.addActionListener( this );
1641)     panelActions.add( buttonActionsUndo );
1642)     buttonActionsRedo = new JButton( loadImageIcon( "Redo.png" ) );
1643)     buttonActionsRedo.setMargin( smallMargin );
1644)     buttonActionsRedo.setToolTipText( "Redo" );
1645)     buttonActionsRedo.setEnabled( false );
1646)     buttonActionsRedo.addActionListener( this );
1647)     panelActions.add( buttonActionsRedo );
1648)     //color panel
1649)     panelColors = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
1650)     panelOuterFrame.add( panelColors, BorderLayout.EAST );
1651)     panelColorsChoose = new JPanel( new GridLayout( constColorCntY, constColorCntX, 5, 5 ) );
1652)     panelColors.add( panelColorsChoose );
1653)     buttonsColor = new JToggleButton[constColorCnt];
1654)     groupColor = new ButtonGroup( );
1655)     for( i = 0; i < constColorCnt; i++ )
1656)     {
1657)       buttonsColor[i] = new JToggleButton( );
1658)       buttonsColor[i].setMargin( smallMargin );
1659)       buttonsColor[i].addActionListener( this );
1660)       groupColor.add( buttonsColor[i] );
1661)       panelColorsChoose.add( buttonsColor[i] );
1662)     }
1663)     //color panel - settings
1664)     panelColorsSettings = new JPanel( new GridLayout( 4, 1, 5, 0 ) );
1665)     panelColors.add( panelColorsSettings );
1666)     labelColorsColor = new JLabel( "color:" );
1667)     labelColorsColor.setVerticalAlignment( JLabel.BOTTOM );
1668)     panelColorsSettings.add( labelColorsColor );
1669)     panelColorsColor = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
1670)     panelColorsSettings.add( panelColorsColor );
1671)     buttonColorsColor = new JButton( );
1672)     buttonColorsColor.setMargin( smallMargin );
1673)     buttonColorsColor.addActionListener( this );
1674)     panelColorsColor.add( buttonColorsColor );
1675)     textColorsColor = new JTextField( "FFFFFF", 6 );
1676)     textColorsColor.setHorizontalAlignment( JTextField.CENTER );
1677)     textColorsColor.addActionListener( this );
1678)     textColorsColor.addFocusListener( this );
1679)     panelColorsColor.add( textColorsColor );
1680)     labelColorsColor.setLabelFor( panelColorsColor );
1681)     labelColorsAlpha = new JLabel( "alpha:" );
1682)     labelColorsAlpha.setVerticalAlignment( JLabel.BOTTOM );
1683)     panelColorsSettings.add( labelColorsAlpha );
1684)     panelColorsAlpha = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
1685)     panelColorsSettings.add( panelColorsAlpha );
1686)     sliderColorsAlpha = new JSlider( JSlider.HORIZONTAL, 0, 255, 255 );
1687)     size = sliderColorsAlpha.getPreferredSize( );
1688)     size.width = size.width * 2 / 5;
1689)     sliderColorsAlpha.setPreferredSize( size );
1690)     sliderColorsAlpha.setSnapToTicks( true );
1691)     sliderColorsAlpha.addChangeListener( this );
1692)     panelColorsAlpha.add( sliderColorsAlpha );
1693)     textColorsAlpha = new JTextField( "FF", 2 );
1694)     textColorsAlpha.setHorizontalAlignment( JTextField.CENTER );
1695)     textColorsAlpha.addActionListener( this );
1696)     textColorsAlpha.addFocusListener( this );
1697)     panelColorsAlpha.add( textColorsAlpha );
1698)     labelColorsAlpha.setLabelFor( panelColorsAlpha );
1699)     //color panel - color icons
1700)     colorIdx = 0;
1701)     colors = new Color[constColorCnt];
1702)     size = textColorsAlpha.getPreferredSize( );
1703)     iconsColor = new ImageIcon[constColorCnt];
1704)     for( i = 0; i < constColorCnt; i++ )
1705)     {
1706)       iconsColor[i] = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
1707)       val = (constColorCnt - 1 - i) * 255 / (constColorCnt - 1);
1708)       colors[i] = new Color( val, val, val );
1709)       iconFromColor( iconsColor[i], colors[i] );
1710)       buttonsColor[i].setIcon( iconsColor[i] );
1711)     }
1712)     iconColorsColor = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
1713)     iconFromColor( iconColorsColor, colors[colorIdx] );
1714)     buttonColorsColor.setIcon( iconColorsColor );
1715)     buttonsColor[colorIdx].setSelected( true );
1716)     frameEditor.setColor( colors[colorIdx] );
1717) 
1718)     //create play timer
1719)     timerPlay = new javax.swing.Timer( 100, this );
1720)     timerPlay.setRepeats( false );
1721)     timerPlay.stop( );
1722) 
1723)     //update controls
1724)     updateFrames( 0 );
1725) 
1726)     //running as full application
1727)     if( isFullApp )
1728)     {
1729)       //calculate size for main window, menus and controls
1730)       frame.pack( );
1731)       //show main window
1732)       frame.setVisible( true );
1733)     }
1734)     //running as applet
1735)     else
1736)     {
1737)       //arrange menus and controls
1738)       size = getSize( );
1739)       resize( 1, 1 );
1740)       resize( size );
1741)     }
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1742) 
1743)     //load initial file
1744)     if( initialFile != null )
1745)     {
1746)       //set current file and current directory
1747)       curFile = (new File( initialFile )).getAbsoluteFile( );
1748)       curDir = curFile.getParentFile( );
1749) 
1750)       //load file
1751)       fileLoad( );
1752)     }
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1753)   }
1754) 
1755)   //entry point for applet
1756)   public void init( )
1757)   {
1758)     javax.swing.SwingUtilities.invokeLater( this );
1759)   }
1760) 
1761)   //entry point for full application
1762)   public static void main( String[] args )
1763)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1764)     int i;
1765)     BlinkenMovie movie;
1766)     Pattern sizePattern, dimPattern;
1767)     Matcher sizeMatcher, dimMatcher;
1768)     String txtOld, txtNew;
1769) 
1770)     //running interactively - without arguments
1771)     if( args.length <= 0 )
1772)     {
1773)       javax.swing.SwingUtilities.invokeLater( new Blimp( null ) );
1774)       return;
1775)     }
1776) 
1777)     //running interactively - load initial file
1778)     if( args.length == 1 && ! args[0].substring( 0, 1 ).equals( "-" ) )
1779)     {
1780)       javax.swing.SwingUtilities.invokeLater( new Blimp( args[0] ) );
1781)       return;
1782)     }
1783) 
1784)     //running as command line tool
1785)     System.out.println( "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1786)                         "version 0.6 date 2005-03-10\n" +
1787)                         "Copyright (C) 2004-2005: Stefan Schuermans <1stein@schuermans.info>\n" +
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1788)                         "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
1789)                         "a blinkenarea.org project\n" +
1790)                         "powered by eventphone.de\n" );
1791) 
1792)     //initialize patterns
1793)     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
1794)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
1795) 
1796)     //get initial movie
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1797)     movie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1798)     movie.insertInfo( 0, "creator", "Blimp (version 0.6 date 2005-03-10)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1799)     movie.insertFrame( 0, new BlinkenFrame( defHeight, defWidth, defChannels, defMaxval, defDuration ) );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1800) 
1801)     //process parameters
1802)     for( i = 0; i < args.length; i++ )
1803)     {
1804) 
1805)       if( args[i].equals( "-h" ) || args[i].equals( "--help" ) )
1806)       {
1807)         System.out.println( "interactive movie editor:\n" +
1808)                             "  java Blimp [<initial-file>]\n" +
1809)                             "\n" +
1810)                             "command line tool:\n" +
1811)                             "  java Blimp <parameter> [<parameter> [...]]\n" +
1812)                             "parameters:\n" +
1813)                             "  -i / --input <file>                                  load movie\n" +
1814)                             "  -r / --resize <width>x<height>-<channels>/<colors>   resize movie\n" +
1815)                             "  -s / --scale <width>x<height>                        scale movie\n" +
1816)                             "  -o / --output <file>                                 save movie\n" +
1817)                             "\n" );
1818)       }
1819) 
1820)       else if( args[i].equals( "-i" ) || args[i].equals( "--input" ) )
1821)       {
1822)         if( i + 1 >= args.length )
1823)         {
1824)           System.out.println( "parameter \"-i\" / \"--input\" requires an argument" );
1825)           break;
1826)         }
1827)         i++;
1828)         if( ! movie.load( args[i] ) )
1829)         {
1830)           System.out.println( "movie \"" + args[i] +  "\" could not be loaded..." );
1831)           break;
1832)         }
1833)         System.out.println( "movie \"" + args[i] +  "\" was loaded successfully..." );
1834)       }
1835) 
1836)       else if( args[i].equals( "-r" ) || args[i].equals( "--resize" ) )
1837)       {
1838)         if( i + 1 >= args.length )
1839)         {
1840)           System.out.println( "parameter \"-r\" / \"--resize\" requires an argument" );
1841)           break;
1842)         }
1843)         i++;
1844)         txtOld = movie.getWidth( ) + "x" +
1845)                  movie.getHeight( ) + "-" + 
1846)                  movie.getChannels( ) + "/" + 
1847)                  (movie.getMaxval( ) + 1);
1848)         if( ! (sizeMatcher = sizePattern.matcher( args[i] )).find( ) )
1849)         {
1850)           System.out.println( "invalid format \"" + args[i] + "\"of size (<width>x<height>-<channles>/<colors>)" );
1851)           break;
1852)         }
1853)         movie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
1854)                       Integer.parseInt( sizeMatcher.group( 1 ) ),
1855)                       Integer.parseInt( sizeMatcher.group( 3 ) ),
1856)                       Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
1857)         txtNew = movie.getWidth( ) + "x" +
1858)                  movie.getHeight( ) + "-" + 
1859)                  movie.getChannels( ) + "/" + 
1860)                  (movie.getMaxval( ) + 1);
1861)         System.out.println( "resized movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1862)       }
1863) 
1864)       else if( args[i].equals( "-s" ) || args[i].equals( "--scale" ) )
1865)       {
1866)         if( i + 1 >= args.length )
1867)         {
1868)           System.out.println( "parameter \"-s\" / \"--scale\" requires an argument" );
1869)           break;
1870)         }
1871)         i++;
1872)         txtOld = movie.getWidth( ) + "x" +
1873)                  movie.getHeight( );
1874)         if( ! (dimMatcher = dimPattern.matcher( args[i] )).find( ) )
1875)         {
1876)           System.out.println( "invalid format \"" + args[i] + "\" of dimension (<width>x<height>)" );
1877)           break;
1878)         }
1879)         movie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
1880)                      Integer.parseInt( dimMatcher.group( 1 ) ) );
1881)         txtNew = movie.getWidth( ) + "x" +
1882)                  movie.getHeight( );
1883)         System.out.println( "scaled movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1884)       }
1885) 
1886)       else if( args[i].equals( "-o" ) || args[i].equals( "--output" ) )
1887)       {
1888)         if( i + 1 >= args.length )
1889)         {
1890)           System.out.println( "parameter \"-o\" / \"--output\" requires an argument" );
1891)           break;
1892)         }
1893)         i++;
1894)         if( ! movie.save( args[i] ) )
1895)         {
1896)           System.out.println( "movie \"" + args[i] +  "\" could not be saved..." );
1897)           break;
1898)         }
1899)         System.out.println( "movie \"" + args[i] +  "\" was saved successfully..." );
1900)       }
1901) 
1902)       else
1903)         System.out.println( "unknown parameter \"" + args[i] + "\" - use \"-h\" or \"--help\" to get help" );
1904) 
1905)     } //for( i...