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

Christian Heimke authored 13 years ago

1) /* BlinkenLightsInteractiveMovieProgram
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

2)  * version 0.5 date 2004-11-19
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

3)  * Copyright (C) 2004: Stefan Schuermans <1stein@schuermans.info>
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.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

87)   }
88) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

145)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
146)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.5 date 2004-11-19)" );
147)     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

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

201)     }
202)   }
203) 
204)   //"File Save" was chosen from menu
205)   private void actionFileSave( )
206)   {
207)     //just call "File Save as" if no current file
208)     if( curFile == null )
209)     {
210)       actionFileSaveAs( );
211)       return;
212)     }
213)     //save file
214)     if( curMovie.save( curFile.getPath( ) ) )
215)     {
216)       //success
217)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" was saved successfully..." );
218)       curMovieChanged = false;
219)     }
220)     else
221)     {
222)       //some error
223)       labelStatus.setText( "movie \"" + curFile.getPath( ) +  "\" could not be saved..." );
224)     }
225)   }
226) 
227)   //"File Save as" was chosen from menu
228)   private void actionFileSaveAs( )
229)   {
230)     JFileChooser fileChooser;
231) 
232)     //show file select dialog
233)     fileChooser = new JFileChooser( );
234)     fileChooser.setDialogTitle( "Blimp - Save as..." );
235)     fileChooser.setFileFilter( new BlinkenFileFilter( ) );
236)     if( curDir != null )
237)       fileChooser.setCurrentDirectory( curDir );
238)     if( curFile != null )
239)       fileChooser.setSelectedFile( curFile );
240)     if( fileChooser.showSaveDialog( dialogParent ) == JFileChooser.APPROVE_OPTION )
241)     {
242)       //save current directory and file
243)       curDir = fileChooser.getCurrentDirectory( );
244)       curFile = fileChooser.getSelectedFile( );
245)       if( frame != null )
246)         frame.setTitle( "Blimp - " + curFile.getPath( ) );
247)       //just call "File Save" to do the work
248)       actionFileSave( );
249)     }
250)   }
251) 
252)   //"File Quit" was chosen from menu
253)   private void actionFileQuit( )
254)   {
255)     JFileChooser fileChooser;
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) 
536)   //"Play Start" was chosen from menu
537)   private void actionPlayStart( )
538)   {
539)     //select no tool
540)     buttonToolsNone.setSelected( true );
541)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
542) 
543)     //disable start, enable stop
544)     menuPlayStart.setEnabled( false );
545)     menuPlayStop.setEnabled( true );
546) 
547)     //stop old play timer
548)     timerPlay.stop( );
549) 
550)     //if play shall start from beginning
551)     if( menuPlayBegin.getState( ) )
552)     {
553)       //show first frame
554)       if( scrollFrames.getValue( ) != 0 ) //value changes
555)         scrollFrames.setValue( 0 ); //play timer will be started again when frame is being shown by scrollbar callback
556)       else //value does not change
557)         stateFrames( ); //value does not change, no event will be sent, execute callback by hand
558)     }
559) 
560)     //start play timer
561)     if( curFrame == null )
562)       timerPlay.setInitialDelay( 100 ); //use 100ms as default
563)     else
564)       timerPlay.setInitialDelay( curFrame.getDuration( ) );
565)     timerPlay.restart( );
566)   }
567) 
568)   //"Play Stop" was chosen from menu
569)   private void actionPlayStop( )
570)   {
571)     //stop play timer
572)     timerPlay.stop( );
573) 
574)     //enable start, disable stop
575)     menuPlayStart.setEnabled( true );
576)     menuPlayStop.setEnabled( false );
577)   }
578) 
579)   //play timer elapsed
580)   private void actionPlayTimer( )
581)   {
582)     int frameCnt, frameNoOld, frameNoNew;
583) 
584)     //stop play timer
585)     timerPlay.stop( );
586) 
587)     //get number of next frame
588)     frameCnt = curMovie.getFrameCnt( );
589)     frameNoOld = scrollFrames.getValue( );
590)     frameNoNew = frameNoOld + 1;
591)     if( frameNoNew >= frameCnt )
592)     {
593)       frameNoNew = 0;
594)       //stop playing if looping is not requested
595)       if( ! menuPlayLoop.getState( ) )
596)       {
597)         //enable start, disable stop
598)         menuPlayStart.setEnabled( true );
599)         menuPlayStop.setEnabled( false );
600)         return;
601)       }
602)     }
603) 
604)     //show next frame
605)     if( frameNoNew != frameNoOld ) //value changes
606)       scrollFrames.setValue( frameNoNew ); //play timer will be started again when frame is being shown by scrollbar callback
607)     else //value does not change
608)       stateFrames( ); //value does not change, no event will be sent, execute callback by hand
609)   }
610) 
611)   //"Help About" was chosen from menu
612)   private void actionHelpAbout( )
613)   {
614)     JOptionPane.showMessageDialog( dialogParent,
615)                                    "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

616)                                    "version 0.5 date 2004-11-19\n" +
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

1066)     else if( e.getSource( ) == menuEditInsertFrame )
1067)       actionEditInsertFrame( );
1068)     else if( e.getSource( ) == menuEditDuplicateFrame )
1069)       actionEditDuplicateFrame( );
1070)     else if( e.getSource( ) == menuEditDeleteFrame )
1071)       actionEditDeleteFrame( );
1072)     else if( e.getSource( ) == menuPlayStart )
1073)       actionPlayStart( );
1074)     else if( e.getSource( ) == menuPlayStop )
1075)       actionPlayStop( );
1076)     else if( e.getSource( ) == timerPlay )
1077)       actionPlayTimer( );
1078)     else if( e.getSource( ) == menuHelpAbout )
1079)       actionHelpAbout( );
1080)     else if( e.getSource( ) == textDuration )
1081)       validateDuration( );
1082)     else if( e.getSource( ) == buttonToolsNone )
1083)       frameEditor.setTool( BlinkenFrameEditor.toolNone );
1084)     else if( e.getSource( ) == buttonToolsColorPicker )
1085)       frameEditor.setTool( BlinkenFrameEditor.toolColorPicker );
1086)     else if( e.getSource( ) == buttonToolsDot )
1087)       frameEditor.setTool( BlinkenFrameEditor.toolDot );
1088)     else if( e.getSource( ) == buttonToolsLine )
1089)       frameEditor.setTool( BlinkenFrameEditor.toolLine );
1090)     else if( e.getSource( ) == buttonToolsRect )
1091)       frameEditor.setTool( BlinkenFrameEditor.toolRect );
1092)     else if( e.getSource( ) == buttonToolsFilledRect )
1093)       frameEditor.setTool( BlinkenFrameEditor.toolFilledRect );
1094)     else if( e.getSource( ) == buttonToolsCircle )
1095)       frameEditor.setTool( BlinkenFrameEditor.toolCircle );
1096)     else if( e.getSource( ) == buttonToolsFilledCircle )
1097)       frameEditor.setTool( BlinkenFrameEditor.toolFilledCircle );
1098)     else if( e.getSource( ) == buttonToolsCopy )
1099)       frameEditor.setTool( BlinkenFrameEditor.toolCopy );
1100)     else if( e.getSource( ) == buttonToolsPaste )
1101)       frameEditor.setTool( BlinkenFrameEditor.toolPaste );
1102)     else if( e.getSource( ) == buttonActionsInvert )
1103)       frameEditor.actionInvert( );
1104)     else if( e.getSource( ) == buttonActionsRotate90 )
1105)       frameEditor.actionRotate90( );
1106)     else if( e.getSource( ) == buttonActionsRotate180 )
1107)       frameEditor.actionRotate180( );
1108)     else if( e.getSource( ) == buttonActionsRotate270 )
1109)       frameEditor.actionRotate270( );
1110)     else if( e.getSource( ) == buttonActionsMirrorHor )
1111)       frameEditor.actionMirrorHor( );
1112)     else if( e.getSource( ) == buttonActionsMirrorVer )
1113)       frameEditor.actionMirrorVer( );
1114)     else if( e.getSource( ) == buttonActionsMirrorDiag )
1115)       frameEditor.actionMirrorDiag( );
1116)     else if( e.getSource( ) == buttonActionsMirrorDiag2 )
1117)       frameEditor.actionMirrorDiag2( );
1118)     else if( e.getSource( ) == buttonActionsRollLeft )
1119)       frameEditor.actionRollLeft( );
1120)     else if( e.getSource( ) == buttonActionsRollRight )
1121)       frameEditor.actionRollRight( );
1122)     else if( e.getSource( ) == buttonActionsRollUp )
1123)       frameEditor.actionRollUp( );
1124)     else if( e.getSource( ) == buttonActionsRollDown )
1125)       frameEditor.actionRollDown( );
1126)     else if( e.getSource( ) == buttonActionsUndo )
1127)       frameEditor.actionUndo( );
1128)     else if( e.getSource( ) == buttonActionsRedo )
1129)       frameEditor.actionRedo( );
1130)     else if( e.getSource( ) == buttonColorsColor )
1131)       actionColorsColor( );
1132)     else if( e.getSource( ) == textColorsColor )
1133)       validateColorsColor( );
1134)     else if( e.getSource( ) == textColorsAlpha )
1135)       validateColorsAlpha( );
1136)     else
1137)     {
1138)       for( i = 0; i < constColorCnt; i++ )
1139)         if( e.getSource( ) == buttonsColor[i] )
1140)           break;
1141)       if( i < constColorCnt )
1142)         actionColorIdx( i );
1143)     }
1144)   }
1145) 
1146)   //some GUI value was adjusted
1147)   public void adjustmentValueChanged( AdjustmentEvent e )
1148)   {
1149)     if( e.getSource( ) == scrollFrames )
1150)       stateFrames( );
1151)   }
1152) 
1153)   //some GUI state changed
1154)   public void stateChanged( ChangeEvent e )
1155)   {
1156)     if( e.getSource( ) == sliderFrameZoom )
1157)       stateFrameZoom( );
1158)     else if( e.getSource( ) == sliderColorsAlpha )
1159)       stateColorsAlpha( );
1160)   }
1161) 
1162)   //a control got the focus
1163)   public void focusGained( FocusEvent e )
1164)   {
1165)   }
1166) 
1167)   //a control lost the focus
1168)   public void focusLost( FocusEvent e )
1169)   {
1170)     if( e.getSource( ) == textDuration )
1171)       validateDuration( );
1172)     else if( e.getSource( ) == textColorsColor )
1173)       validateColorsColor( );
1174)     else if( e.getSource( ) == textColorsAlpha )
1175)       validateColorsAlpha( );
1176)   }
1177) 
1178)   //something was changed in a document
1179)   public void changedUpdate( DocumentEvent e )
1180)   {
1181)     if( e.getDocument( ) == textDuration.getDocument( ) )
1182)       changeDuration( );
1183)     else if( e.getDocument( ) == textColorsColor.getDocument( ) )
1184)       changeColorsColor( );
1185)     else if( e.getDocument( ) == textColorsAlpha.getDocument( ) )
1186)       changeColorsAlpha( );
1187)   }
1188) 
1189)   //something was inserted into a document
1190)   public void insertUpdate( DocumentEvent e )
1191)   {
1192)     if( e.getDocument( ) == textDuration.getDocument( ) )
1193)       changeDuration( );
1194)   }
1195) 
1196)   //something was removed from a document
1197)   public void removeUpdate( DocumentEvent e )
1198)   {
1199)     if( e.getDocument( ) == textDuration.getDocument( ) )
1200)       changeDuration( );
1201)   }
1202) 
1203)   //info text of frame editor changed
1204)   public void blinkenFrameEditorInfo( String info )
1205)   {
1206)     labelFrameInfo.setText( info );
1207)   }
1208) 
1209)   //a color was picked in the frame editor
1210)   public void blinkenFrameEditorColorPicked( Color color )
1211)   {
1212)     //save new color
1213)     colors[colorIdx] = color;
1214) 
1215)     //redisplay new color (incl. alpha)
1216)     showColorsColor( );
1217)     showColorsAlpha( );
1218) 
1219)     //update color icon of active color
1220)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1221)     buttonsColor[colorIdx].repaint( );
1222) 
1223)     //set color of frame editor to new color
1224)     frameEditor.setColor( colors[colorIdx] );
1225)   }
1226) 
1227)   //the current frame was changed in the frame editor
1228)   public void blinkenFrameEditorFrameChanged( )
1229)   {
1230)     curMovieChanged = true;
1231)   }
1232) 
1233)   //the possibility to perfon an undo or redo operation changed
1234)   public void blinkenFrameEditorCanUndoRedo( boolean canUndo, boolean canRedo )
1235)   {
1236)     buttonActionsUndo.setEnabled( canUndo );
1237)     buttonActionsRedo.setEnabled( canRedo );
1238)   }
1239) 
1240)   //entry point of main thread
1241)   public void run( )
1242)   {
1243)     int i, val;
1244)     Dimension size;
1245)     Insets smallMargin;
1246) 
1247)     //initialize current movie, frame
1248)     curDir = new File( "." );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1249)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
1250)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.5 date 2004-11-19)" );
1251)     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

1252)     curFrame = null;
1253) 
1254)     //runnning as full application
1255)     if( isFullApp )
1256)     {
1257)       //create main window
1258)       JFrame.setDefaultLookAndFeelDecorated( true );
1259)       frame = new JFrame( "Blimp" );
1260)       frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
1261)       frame.addWindowListener( this );
1262)       //create menu bar
1263)       menubar = new JMenuBar( );
1264)       frame.setJMenuBar( menubar );
1265)       //create main panel
1266)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1267)       frame.getContentPane( ).add( panel );
1268)       //use main window as parent for dialogs
1269)       dialogParent = frame;
1270)     }
1271)     //runnning as applet
1272)     else
1273)     {
1274)       //no main window - applet is main window
1275)       frame = null;
1276)       //create menu bar
1277)       menubar = new JMenuBar( );
1278)       setJMenuBar( menubar );
1279)       //create main panel
1280)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1281)       getContentPane( ).add( panel );
1282)       //use applet as parent for dialogs
1283)       dialogParent = this;
1284)     }
1285) 
1286)     //create menus
1287)     //file menu
1288)     menuFile = new JMenu( "File" );
1289)     menubar.add( menuFile );
1290)     menuFileNew = new JMenuItem( "New" );
1291)     menuFileNew.addActionListener( this );
1292)     menuFile.add( menuFileNew );
1293)     menuFileLoad = new JMenuItem( "Load..." );
1294)     menuFileLoad.addActionListener( this );
1295)     menuFile.add( menuFileLoad );
1296)     menuFileSave = new JMenuItem( "Save" );
1297)     menuFileSave.addActionListener( this );
1298)     menuFile.add( menuFileSave );
1299)     menuFileSaveAs = new JMenuItem( "Save as..." );
1300)     menuFileSaveAs.addActionListener( this );
1301)     menuFile.add( menuFileSaveAs );
1302)     if( isFullApp )
1303)       menuFile.addSeparator( );
1304)     menuFileQuit = new JMenuItem( "Quit" );
1305)     menuFileQuit.addActionListener( this );
1306)     if( isFullApp )
1307)       menuFile.add( menuFileQuit );
1308)     //information menu
1309)     menuInfo = new JMenu( "Information" );
1310)     menubar.add( menuInfo );
1311)     menuInfoShow = new JMenuItem( "Show..." );
1312)     menuInfoShow.addActionListener( this );
1313)     menuInfo.add( menuInfoShow );
1314)     menuInfoAdd = new JMenuItem( "Add..." );
1315)     menuInfoAdd.addActionListener( this );
1316)     menuInfo.add( menuInfoAdd );
1317)     menuInfoDelete = new JMenuItem( "Delete..." );
1318)     menuInfoDelete.addActionListener( this );
1319)     menuInfo.add( menuInfoDelete );
1320)     //edit menu
1321)     menuEdit = new JMenu( "Edit" );
1322)     menubar.add( menuEdit );
1323)     menuEditResize = new JMenuItem( "Resize Movie..." );
1324)     menuEditResize.addActionListener( this );
1325)     menuEdit.add( menuEditResize );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

1329)     menuEdit.addSeparator( );
1330)     menuEditInsertFrame = new JMenuItem( "Insert Frame" );
1331)     menuEditInsertFrame.addActionListener( this );
1332)     menuEdit.add( menuEditInsertFrame );
1333)     menuEditDuplicateFrame = new JMenuItem( "Duplicate Frame" );
1334)     menuEditDuplicateFrame.setEnabled( false );
1335)     menuEditDuplicateFrame.addActionListener( this );
1336)     menuEdit.add( menuEditDuplicateFrame );
1337)     menuEditDeleteFrame = new JMenuItem( "Delete Frame" );
1338)     menuEditDeleteFrame.setEnabled( false );
1339)     menuEditDeleteFrame.addActionListener( this );
1340)     menuEdit.add( menuEditDeleteFrame );
1341)     //play menu
1342)     menuPlay = new JMenu( "Play" );
1343)     menubar.add( menuPlay );
1344)     menuPlayStart = new JMenuItem( "Start" );
1345)     menuPlayStart.addActionListener( this );
1346)     menuPlay.add( menuPlayStart );
1347)     menuPlayStop = new JMenuItem( "Stop" );
1348)     menuPlayStop.setEnabled( false );
1349)     menuPlayStop.addActionListener( this );
1350)     menuPlay.add( menuPlayStop );
1351)     menuPlay.addSeparator( );
1352)     menuPlayBegin = new JCheckBoxMenuItem( "From Begin", false );
1353)     menuPlayBegin.addActionListener( this );
1354)     menuPlay.add( menuPlayBegin );
1355)     menuPlayLoop = new JCheckBoxMenuItem( "Looped", false );
1356)     menuPlayLoop.addActionListener( this );
1357)     menuPlay.add( menuPlayLoop );
1358)     //help menu
1359)     menuHelp = new JMenu( "Help" );
1360)     menubar.add( menuHelp );
1361)     menuHelpAbout = new JMenuItem( "About..." );
1362)     menuHelpAbout.addActionListener( this );
1363)     menuHelp.add( menuHelpAbout );
1364) 
1365)     //create controls
1366)     smallMargin = new Insets( 1, 1, 1, 1 );
1367)     panel.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
1368)     //status bar
1369)     panelStatus = new JPanel( new BorderLayout( 5, 5 ) );
1370)     panel.add( panelStatus, BorderLayout.SOUTH );
1371)     panelStatus.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.NORTH );
1372)     labelStatus = new JLabel( "ready..." );
1373)     panelStatus.add( labelStatus, BorderLayout.CENTER );
1374)     //main panel
1375)     panelMain = new JPanel( new BorderLayout( 5, 5 ) );
1376)     panel.add( panelMain, BorderLayout.CENTER );
1377)     //frames panel
1378)     panelFrames = new JPanel( new BorderLayout( 5, 5 ) );
1379)     panelMain.add( panelFrames, BorderLayout.SOUTH );
1380)     scrollFrames = new JScrollBar( SwingConstants.HORIZONTAL, 0, 0, 0, 0 );
1381)     scrollFrames.setBlockIncrement( 1 );
1382)     scrollFrames.addAdjustmentListener( this );
1383)     panelFrames.add( scrollFrames, BorderLayout.CENTER );
1384)     labelFrames = new JLabel( "frame: -/0" );
1385)     labelFrames.setLabelFor( scrollFrames );
1386)     panelFrames.add( labelFrames, BorderLayout.WEST );
1387)     //outer and middle frame panel
1388)     panelOuterFrame = new JPanel( new BorderLayout( 5, 5 ) );
1389)     panelMain.add( panelOuterFrame, BorderLayout.CENTER );
1390)     panelOuterFrame.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1391)     panelMiddleFrame = new JPanel( new BorderLayout( 5, 5 ) );
1392)     panelOuterFrame.add( panelMiddleFrame, BorderLayout.CENTER );
1393)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.WEST );
1394)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.EAST );
1395)     //frame panel
1396)     panelFrame = new JPanel( new BorderLayout( 5, 5 ) );
1397)     panelMiddleFrame.add( panelFrame, BorderLayout.CENTER );
1398)     sliderFrameZoom = new JSlider( JSlider.VERTICAL, 0, 6, 3 );
1399)     sliderFrameZoom.setSnapToTicks( true );
1400)     sliderFrameZoom.setInverted( true );
1401)     sliderFrameZoom.addChangeListener( this );
1402)     sliderFrameZoom.setToolTipText( "Zoom" );
1403)     panelFrame.add( sliderFrameZoom, BorderLayout.EAST );
1404)     frameEditor = new BlinkenFrameEditor( );
1405)     frameEditor.setZoom( sliderFrameZoom.getValue( ) );
1406)     scrollpaneFrame = new JScrollPane( frameEditor );
1407)     panelFrame.add( scrollpaneFrame, BorderLayout.CENTER );
1408)     labelFrameInfo = new JLabel( "", JLabel.CENTER );
1409)     labelFrameInfo.setLabelFor( frameEditor );
1410)     panelFrame.add( labelFrameInfo, BorderLayout.NORTH );
1411)     frameEditor.setEditorListener( this );
1412)     panelDuration = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 5 ) );
1413)     panelFrame.add( panelDuration, BorderLayout.SOUTH );
1414)     textDuration = new JTextField( 5 );
1415)     textDuration.setHorizontalAlignment( JTextField.CENTER );
1416)     textDuration.setEnabled( false );
1417)     textDuration.getDocument( ).addDocumentListener( this );
1418)     textDuration.addActionListener( this );
1419)     textDuration.addFocusListener( this );
1420)     labelDuration = new JLabel( "duration (ms): " );
1421)     labelDuration.setLabelFor( textDuration );
1422)     panelDuration.add( labelDuration );
1423)     panelDuration.add( textDuration );
1424)     //tool and action panels
1425)     panelOuterTools = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
1426)     panelOuterFrame.add( panelOuterTools, BorderLayout.WEST );
1427)     panelMiddleTools = new JPanel( new BorderLayout( 5, 5 ) );
1428)     panelOuterTools.add( panelMiddleTools );
1429)     panelTools = new JPanel( new GridLayout( 4, 3, 5, 5 ) );
1430)     panelMiddleTools.add( panelTools, BorderLayout.CENTER );
1431)     panelMiddleTools.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1432)     panelActions = new JPanel( new GridLayout( 5, 3, 5, 5 ) );
1433)     panelOuterTools.add( panelActions );
1434)     //tool buttons
1435)     groupTools = new ButtonGroup( );
1436)     buttonToolsNone = new JToggleButton( );
1437)     buttonToolsNone.setMargin( smallMargin );
1438)     buttonToolsNone.setToolTipText( "no tool" );
1439)     buttonToolsNone.addActionListener( this );
1440)     groupTools.add( buttonToolsNone );
1441)     panelTools.add( buttonToolsNone );
1442)     buttonToolsColorPicker = new JToggleButton( loadImageIcon( "ColorPicker.png" ) );
1443)     buttonToolsColorPicker.setMargin( smallMargin );
1444)     buttonToolsColorPicker.setToolTipText( "Color Picker" );
1445)     buttonToolsColorPicker.addActionListener( this );
1446)     groupTools.add( buttonToolsColorPicker );
1447)     panelTools.add( buttonToolsColorPicker );
1448)     buttonToolsDot = new JToggleButton( loadImageIcon( "Dot.png" ) );
1449)     buttonToolsDot.setMargin( smallMargin );
1450)     buttonToolsDot.setToolTipText( "Dot" );
1451)     buttonToolsDot.addActionListener( this );
1452)     groupTools.add( buttonToolsDot );
1453)     panelTools.add( buttonToolsDot );
1454)     buttonToolsLine = new JToggleButton( loadImageIcon( "Line.png" ) );
1455)     buttonToolsLine.setMargin( smallMargin );
1456)     buttonToolsLine.setToolTipText( "Line" );
1457)     buttonToolsLine.addActionListener( this );
1458)     groupTools.add( buttonToolsLine );
1459)     panelTools.add( buttonToolsLine );
1460)     buttonToolsRect = new JToggleButton( loadImageIcon( "Rectangle.png" ) );
1461)     buttonToolsRect.setMargin( smallMargin );
1462)     buttonToolsRect.setToolTipText( "Rectangle" );
1463)     buttonToolsRect.addActionListener( this );
1464)     groupTools.add( buttonToolsRect );
1465)     panelTools.add( buttonToolsRect );
1466)     buttonToolsFilledRect = new JToggleButton( loadImageIcon( "FilledRectangle.png" ) );
1467)     buttonToolsFilledRect.setMargin( smallMargin );
1468)     buttonToolsFilledRect.setToolTipText( "Filled Rectangle" );
1469)     buttonToolsFilledRect.addActionListener( this );
1470)     groupTools.add( buttonToolsFilledRect );
1471)     panelTools.add( buttonToolsFilledRect );
1472)     panelTools.add( new JLabel( ) );
1473)     buttonToolsCircle = new JToggleButton( loadImageIcon( "Circle.png" ) );
1474)     buttonToolsCircle.setMargin( smallMargin );
1475)     buttonToolsCircle.setToolTipText( "Circle" );
1476)     buttonToolsCircle.addActionListener( this );
1477)     groupTools.add( buttonToolsCircle );
1478)     panelTools.add( buttonToolsCircle );
1479)     buttonToolsFilledCircle = new JToggleButton( loadImageIcon( "FilledCircle.png" ) );
1480)     buttonToolsFilledCircle.setMargin( smallMargin );
1481)     buttonToolsFilledCircle.setToolTipText( "Filled Circle" );
1482)     buttonToolsFilledCircle.addActionListener( this );
1483)     groupTools.add( buttonToolsFilledCircle );
1484)     panelTools.add( buttonToolsFilledCircle );
1485)     panelTools.add( new JLabel( ) );
1486)     buttonToolsCopy = new JToggleButton( loadImageIcon( "Copy.png" ) );
1487)     buttonToolsCopy.setMargin( smallMargin );
1488)     buttonToolsCopy.setToolTipText( "Copy" );
1489)     buttonToolsCopy.addActionListener( this );
1490)     groupTools.add( buttonToolsCopy );
1491)     panelTools.add( buttonToolsCopy );
1492)     buttonToolsPaste = new JToggleButton( loadImageIcon( "Paste.png" ) );
1493)     buttonToolsPaste.setMargin( smallMargin );
1494)     buttonToolsPaste.setToolTipText( "Paste" );
1495)     buttonToolsPaste.addActionListener( this );
1496)     groupTools.add( buttonToolsPaste );
1497)     panelTools.add( buttonToolsPaste );
1498)     buttonToolsNone.setSelected( true );
1499)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
1500)     //action buttons
1501)     buttonActionsInvert = new JButton( loadImageIcon( "Invert.png" ) );
1502)     buttonActionsInvert.setMargin( smallMargin );
1503)     buttonActionsInvert.setToolTipText( "Invert" );
1504)     buttonActionsInvert.addActionListener( this );
1505)     panelActions.add( buttonActionsInvert );
1506)     buttonActionsMirrorHor = new JButton( loadImageIcon( "MirrorHor.png" ) );
1507)     buttonActionsMirrorHor.setMargin( smallMargin );
1508)     buttonActionsMirrorHor.setToolTipText( "Mirror Horizontally" );
1509)     buttonActionsMirrorHor.addActionListener( this );
1510)     panelActions.add( buttonActionsMirrorHor );
1511)     buttonActionsRollLeft = new JButton( loadImageIcon( "RollLeft.png" ) );
1512)     buttonActionsRollLeft.setMargin( smallMargin );
1513)     buttonActionsRollLeft.setToolTipText( "Roll Left" );
1514)     buttonActionsRollLeft.addActionListener( this );
1515)     panelActions.add( buttonActionsRollLeft );
1516)     buttonActionsRotate90 = new JButton( loadImageIcon( "Rotate90.png" ) );
1517)     buttonActionsRotate90.setMargin( smallMargin );
1518)     buttonActionsRotate90.setToolTipText( "Rotate 90 Degrees" );
1519)     buttonActionsRotate90.addActionListener( this );
1520)     panelActions.add( buttonActionsRotate90 );
1521)     buttonActionsMirrorVer = new JButton( loadImageIcon( "MirrorVer.png" ) );
1522)     buttonActionsMirrorVer.setMargin( smallMargin );
1523)     buttonActionsMirrorVer.setToolTipText( "Mirror Vertically" );
1524)     buttonActionsMirrorVer.addActionListener( this );
1525)     panelActions.add( buttonActionsMirrorVer );
1526)     buttonActionsRollRight = new JButton( loadImageIcon( "RollRight.png" ) );
1527)     buttonActionsRollRight.setMargin( smallMargin );
1528)     buttonActionsRollRight.setToolTipText( "Roll Right" );
1529)     buttonActionsRollRight.addActionListener( this );
1530)     panelActions.add( buttonActionsRollRight );
1531)     buttonActionsRotate180 = new JButton( loadImageIcon( "Rotate180.png" ) );
1532)     buttonActionsRotate180.setMargin( smallMargin );
1533)     buttonActionsRotate180.setToolTipText( "Rotate 180 Degrees" );
1534)     buttonActionsRotate180.addActionListener( this );
1535)     panelActions.add( buttonActionsRotate180 );
1536)     buttonActionsMirrorDiag = new JButton( loadImageIcon( "MirrorDiag.png" ) );
1537)     buttonActionsMirrorDiag.setMargin( smallMargin );
1538)     buttonActionsMirrorDiag.setToolTipText( "Mirror Diagonally (\\)" );
1539)     buttonActionsMirrorDiag.addActionListener( this );
1540)     panelActions.add( buttonActionsMirrorDiag );
1541)     buttonActionsRollUp = new JButton( loadImageIcon( "RollUp.png" ) );
1542)     buttonActionsRollUp.setMargin( smallMargin );
1543)     buttonActionsRollUp.setToolTipText( "Roll Up" );
1544)     buttonActionsRollUp.addActionListener( this );
1545)     panelActions.add( buttonActionsRollUp );
1546)     buttonActionsRotate270 = new JButton( loadImageIcon( "Rotate270.png" ) );
1547)     buttonActionsRotate270.setMargin( smallMargin );
1548)     buttonActionsRotate270.setToolTipText( "Rotate 270 Degrees" );
1549)     buttonActionsRotate270.addActionListener( this );
1550)     panelActions.add( buttonActionsRotate270 );
1551)     buttonActionsMirrorDiag2 = new JButton( loadImageIcon( "MirrorDiag2.png" ) );
1552)     buttonActionsMirrorDiag2.setMargin( smallMargin );
1553)     buttonActionsMirrorDiag2.setToolTipText( "Mirror Diagonally (/)" );
1554)     buttonActionsMirrorDiag2.addActionListener( this );
1555)     panelActions.add( buttonActionsMirrorDiag2 );
1556)     buttonActionsRollDown = new JButton( loadImageIcon( "RollDown.png" ) );
1557)     buttonActionsRollDown.setMargin( smallMargin );
1558)     buttonActionsRollDown.setToolTipText( "Roll Down" );
1559)     buttonActionsRollDown.addActionListener( this );
1560)     panelActions.add( buttonActionsRollDown );
1561)     panelActions.add( new JLabel( ) );
1562)     buttonActionsUndo = new JButton( loadImageIcon( "Undo.png" ) );
1563)     buttonActionsUndo.setMargin( smallMargin );
1564)     buttonActionsUndo.setToolTipText( "Undo" );
1565)     buttonActionsUndo.setEnabled( false );
1566)     buttonActionsUndo.addActionListener( this );
1567)     panelActions.add( buttonActionsUndo );
1568)     buttonActionsRedo = new JButton( loadImageIcon( "Redo.png" ) );
1569)     buttonActionsRedo.setMargin( smallMargin );
1570)     buttonActionsRedo.setToolTipText( "Redo" );
1571)     buttonActionsRedo.setEnabled( false );
1572)     buttonActionsRedo.addActionListener( this );
1573)     panelActions.add( buttonActionsRedo );
1574)     //color panel
1575)     panelColors = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
1576)     panelOuterFrame.add( panelColors, BorderLayout.EAST );
1577)     panelColorsChoose = new JPanel( new GridLayout( constColorCntY, constColorCntX, 5, 5 ) );
1578)     panelColors.add( panelColorsChoose );
1579)     buttonsColor = new JToggleButton[constColorCnt];
1580)     groupColor = new ButtonGroup( );
1581)     for( i = 0; i < constColorCnt; i++ )
1582)     {
1583)       buttonsColor[i] = new JToggleButton( );
1584)       buttonsColor[i].setMargin( smallMargin );
1585)       buttonsColor[i].addActionListener( this );
1586)       groupColor.add( buttonsColor[i] );
1587)       panelColorsChoose.add( buttonsColor[i] );
1588)     }
1589)     //color panel - settings
1590)     panelColorsSettings = new JPanel( new GridLayout( 4, 1, 5, 0 ) );
1591)     panelColors.add( panelColorsSettings );
1592)     labelColorsColor = new JLabel( "color:" );
1593)     labelColorsColor.setVerticalAlignment( JLabel.BOTTOM );
1594)     panelColorsSettings.add( labelColorsColor );
1595)     panelColorsColor = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
1596)     panelColorsSettings.add( panelColorsColor );
1597)     buttonColorsColor = new JButton( );
1598)     buttonColorsColor.setMargin( smallMargin );
1599)     buttonColorsColor.addActionListener( this );
1600)     panelColorsColor.add( buttonColorsColor );
1601)     textColorsColor = new JTextField( "FFFFFF", 6 );
1602)     textColorsColor.setHorizontalAlignment( JTextField.CENTER );
1603)     textColorsColor.addActionListener( this );
1604)     textColorsColor.addFocusListener( this );
1605)     panelColorsColor.add( textColorsColor );
1606)     labelColorsColor.setLabelFor( panelColorsColor );
1607)     labelColorsAlpha = new JLabel( "alpha:" );
1608)     labelColorsAlpha.setVerticalAlignment( JLabel.BOTTOM );
1609)     panelColorsSettings.add( labelColorsAlpha );
1610)     panelColorsAlpha = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
1611)     panelColorsSettings.add( panelColorsAlpha );
1612)     sliderColorsAlpha = new JSlider( JSlider.HORIZONTAL, 0, 255, 255 );
1613)     size = sliderColorsAlpha.getPreferredSize( );
1614)     size.width = size.width * 2 / 5;
1615)     sliderColorsAlpha.setPreferredSize( size );
1616)     sliderColorsAlpha.setSnapToTicks( true );
1617)     sliderColorsAlpha.addChangeListener( this );
1618)     panelColorsAlpha.add( sliderColorsAlpha );
1619)     textColorsAlpha = new JTextField( "FF", 2 );
1620)     textColorsAlpha.setHorizontalAlignment( JTextField.CENTER );
1621)     textColorsAlpha.addActionListener( this );
1622)     textColorsAlpha.addFocusListener( this );
1623)     panelColorsAlpha.add( textColorsAlpha );
1624)     labelColorsAlpha.setLabelFor( panelColorsAlpha );
1625)     //color panel - color icons
1626)     colorIdx = 0;
1627)     colors = new Color[constColorCnt];
1628)     size = textColorsAlpha.getPreferredSize( );
1629)     iconsColor = new ImageIcon[constColorCnt];
1630)     for( i = 0; i < constColorCnt; i++ )
1631)     {
1632)       iconsColor[i] = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
1633)       val = (constColorCnt - 1 - i) * 255 / (constColorCnt - 1);
1634)       colors[i] = new Color( val, val, val );
1635)       iconFromColor( iconsColor[i], colors[i] );
1636)       buttonsColor[i].setIcon( iconsColor[i] );
1637)     }
1638)     iconColorsColor = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
1639)     iconFromColor( iconColorsColor, colors[colorIdx] );
1640)     buttonColorsColor.setIcon( iconColorsColor );
1641)     buttonsColor[colorIdx].setSelected( true );
1642)     frameEditor.setColor( colors[colorIdx] );
1643) 
1644)     //create play timer
1645)     timerPlay = new javax.swing.Timer( 100, this );
1646)     timerPlay.setRepeats( false );
1647)     timerPlay.stop( );
1648) 
1649)     //update controls
1650)     updateFrames( 0 );
1651) 
1652)     //running as full application
1653)     if( isFullApp )
1654)     {
1655)       //calculate size for main window, menus and controls
1656)       frame.pack( );
1657)       //show main window
1658)       frame.setVisible( true );
1659)     }
1660)     //running as applet
1661)     else
1662)     {
1663)       //arrange menus and controls
1664)       size = getSize( );
1665)       resize( 1, 1 );
1666)       resize( size );
1667)     }
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1668) 
1669)     //load initial file
1670)     if( initialFile != null )
1671)     {
1672)       //set current file and current directory
1673)       curFile = (new File( initialFile )).getAbsoluteFile( );
1674)       curDir = curFile.getParentFile( );
1675) 
1676)       //load file
1677)       fileLoad( );
1678)     }
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1679)   }
1680) 
1681)   //entry point for applet
1682)   public void init( )
1683)   {
1684)     javax.swing.SwingUtilities.invokeLater( this );
1685)   }
1686) 
1687)   //entry point for full application
1688)   public static void main( String[] args )
1689)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1690)     int i;
1691)     BlinkenMovie movie;
1692)     Pattern sizePattern, dimPattern;
1693)     Matcher sizeMatcher, dimMatcher;
1694)     String txtOld, txtNew;
1695) 
1696)     //running interactively - without arguments
1697)     if( args.length <= 0 )
1698)     {
1699)       javax.swing.SwingUtilities.invokeLater( new Blimp( null ) );
1700)       return;
1701)     }
1702) 
1703)     //running interactively - load initial file
1704)     if( args.length == 1 && ! args[0].substring( 0, 1 ).equals( "-" ) )
1705)     {
1706)       javax.swing.SwingUtilities.invokeLater( new Blimp( args[0] ) );
1707)       return;
1708)     }
1709) 
1710)     //running as command line tool
1711)     System.out.println( "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1712)                         "version 0.5 date 2004-11-19\n" +
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1713)                         "Copyright (C) 2004: Stefan Schuermans <1stein@schuermans.info>\n" +
1714)                         "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
1715)                         "a blinkenarea.org project\n" +
1716)                         "powered by eventphone.de\n" );
1717) 
1718)     //initialize patterns
1719)     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
1720)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
1721) 
1722)     //get initial movie
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1723)     movie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
1724)     movie.insertInfo( 0, "creator", "Blimp (version 0.5 date 2004-11-19)" );
1725)     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

1726) 
1727)     //process parameters
1728)     for( i = 0; i < args.length; i++ )
1729)     {
1730) 
1731)       if( args[i].equals( "-h" ) || args[i].equals( "--help" ) )
1732)       {
1733)         System.out.println( "interactive movie editor:\n" +
1734)                             "  java Blimp [<initial-file>]\n" +
1735)                             "\n" +
1736)                             "command line tool:\n" +
1737)                             "  java Blimp <parameter> [<parameter> [...]]\n" +
1738)                             "parameters:\n" +
1739)                             "  -i / --input <file>                                  load movie\n" +
1740)                             "  -r / --resize <width>x<height>-<channels>/<colors>   resize movie\n" +
1741)                             "  -s / --scale <width>x<height>                        scale movie\n" +
1742)                             "  -o / --output <file>                                 save movie\n" +
1743)                             "\n" );
1744)       }
1745) 
1746)       else if( args[i].equals( "-i" ) || args[i].equals( "--input" ) )
1747)       {
1748)         if( i + 1 >= args.length )
1749)         {
1750)           System.out.println( "parameter \"-i\" / \"--input\" requires an argument" );
1751)           break;
1752)         }
1753)         i++;
1754)         if( ! movie.load( args[i] ) )
1755)         {
1756)           System.out.println( "movie \"" + args[i] +  "\" could not be loaded..." );
1757)           break;
1758)         }
1759)         System.out.println( "movie \"" + args[i] +  "\" was loaded successfully..." );
1760)       }
1761) 
1762)       else if( args[i].equals( "-r" ) || args[i].equals( "--resize" ) )
1763)       {
1764)         if( i + 1 >= args.length )
1765)         {
1766)           System.out.println( "parameter \"-r\" / \"--resize\" requires an argument" );
1767)           break;
1768)         }
1769)         i++;
1770)         txtOld = movie.getWidth( ) + "x" +
1771)                  movie.getHeight( ) + "-" + 
1772)                  movie.getChannels( ) + "/" + 
1773)                  (movie.getMaxval( ) + 1);
1774)         if( ! (sizeMatcher = sizePattern.matcher( args[i] )).find( ) )
1775)         {
1776)           System.out.println( "invalid format \"" + args[i] + "\"of size (<width>x<height>-<channles>/<colors>)" );
1777)           break;
1778)         }
1779)         movie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
1780)                       Integer.parseInt( sizeMatcher.group( 1 ) ),
1781)                       Integer.parseInt( sizeMatcher.group( 3 ) ),
1782)                       Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
1783)         txtNew = movie.getWidth( ) + "x" +
1784)                  movie.getHeight( ) + "-" + 
1785)                  movie.getChannels( ) + "/" + 
1786)                  (movie.getMaxval( ) + 1);
1787)         System.out.println( "resized movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1788)       }
1789) 
1790)       else if( args[i].equals( "-s" ) || args[i].equals( "--scale" ) )
1791)       {
1792)         if( i + 1 >= args.length )
1793)         {
1794)           System.out.println( "parameter \"-s\" / \"--scale\" requires an argument" );
1795)           break;
1796)         }
1797)         i++;
1798)         txtOld = movie.getWidth( ) + "x" +
1799)                  movie.getHeight( );
1800)         if( ! (dimMatcher = dimPattern.matcher( args[i] )).find( ) )
1801)         {
1802)           System.out.println( "invalid format \"" + args[i] + "\" of dimension (<width>x<height>)" );
1803)           break;
1804)         }
1805)         movie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
1806)                      Integer.parseInt( dimMatcher.group( 1 ) ) );
1807)         txtNew = movie.getWidth( ) + "x" +
1808)                  movie.getHeight( );
1809)         System.out.println( "scaled movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1810)       }
1811) 
1812)       else if( args[i].equals( "-o" ) || args[i].equals( "--output" ) )
1813)       {
1814)         if( i + 1 >= args.length )
1815)         {
1816)           System.out.println( "parameter \"-o\" / \"--output\" requires an argument" );
1817)           break;
1818)         }
1819)         i++;
1820)         if( ! movie.save( args[i] ) )
1821)         {
1822)           System.out.println( "movie \"" + args[i] +  "\" could not be saved..." );
1823)           break;
1824)         }
1825)         System.out.println( "movie \"" + args[i] +  "\" was saved successfully..." );
1826)       }
1827) 
1828)       else
1829)         System.out.println( "unknown parameter \"" + args[i] + "\" - use \"-h\" or \"--help\" to get help" );
1830) 
1831)     } //for( i...