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

Christian Heimke authored 13 years ago

1) /* BlinkenLightsInteractiveMovieProgram
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

2)  * version 0.3 date 2004-11-12
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;
29) 
30)   //configuration variables
31)   boolean isFullApp = false; //if running as full application
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

145)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.3 date 2004-11-12)" );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

463)   //"Edit Insert Frame" was chosen from menu
464)   private void actionEditInsertFrame( )
465)   {
466)     BlinkenFrame frame;
467)     int frameCnt, frameNo;
468) 
469)     //create new empty frame
470)     frame = new BlinkenFrame( curMovie.getHeight( ), curMovie.getWidth( ),
471)                               curMovie.getChannels( ), curMovie.getMaxval( ), 100 );
472)     frame.clear( );
473) 
474)     //insert frame behind current position
475)     frameCnt = curMovie.getFrameCnt( );
476)     frameNo = scrollFrames.getValue( ) + 1;
477)     if( frameNo < 0 )
478)       frameNo = 0;
479)     if( frameNo > frameCnt )
480)       frameNo = frameCnt;
481)     curMovie.insertFrame( frameNo, frame );
482)     curMovieChanged = true;
483) 
484)     //update controls
485)     updateFrames( frameNo );
486)   }
487) 
488)   //"Edit Duplicate Frame" was chosen from menu
489)   private void actionEditDuplicateFrame( )
490)   {
491)     BlinkenFrame frame;
492)     int frameCnt, frameNo;
493) 
494)     //do nothing if there is no current frame
495)     if( curFrame == null )
496)       return;
497) 
498)     //duplicate current frame
499)     frame = new BlinkenFrame( curFrame );
500) 
501)     //insert frame behind current position
502)     frameCnt = curMovie.getFrameCnt( );
503)     frameNo = scrollFrames.getValue( ) + 1;
504)     if( frameNo < 0 )
505)       frameNo = 0;
506)     if( frameNo > frameCnt )
507)       frameNo = frameCnt;
508)     curMovie.insertFrame( frameNo, frame );
509)     curMovieChanged = true;
510) 
511)     //update controls
512)     updateFrames( frameNo );
513)   }
514) 
515)   //"Edit Delete Frame" was chosen from menu
516)   private void actionEditDeleteFrame( )
517)   {
518)     int frameNo;
519) 
520)     //do nothing if there is no current frame
521)     if( curFrame == null )
522)       return;
523) 
524)     //delete current frame
525)     frameNo = scrollFrames.getValue( );
526)     curMovie.deleteFrame( frameNo );
527)     frameNo--;
528)     curMovieChanged = true;
529) 
530)     //update controls
531)     updateFrames( frameNo );
532)   }
533) 
534)   //"Play Start" was chosen from menu
535)   private void actionPlayStart( )
536)   {
537)     //select no tool
538)     buttonToolsNone.setSelected( true );
539)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
540) 
541)     //disable start, enable stop
542)     menuPlayStart.setEnabled( false );
543)     menuPlayStop.setEnabled( true );
544) 
545)     //stop old play timer
546)     timerPlay.stop( );
547) 
548)     //if play shall start from beginning
549)     if( menuPlayBegin.getState( ) )
550)     {
551)       //show first frame
552)       if( scrollFrames.getValue( ) != 0 ) //value changes
553)         scrollFrames.setValue( 0 ); //play timer will be started again when frame is being shown by scrollbar callback
554)       else //value does not change
555)         stateFrames( ); //value does not change, no event will be sent, execute callback by hand
556)     }
557) 
558)     //start play timer
559)     if( curFrame == null )
560)       timerPlay.setInitialDelay( 100 ); //use 100ms as default
561)     else
562)       timerPlay.setInitialDelay( curFrame.getDuration( ) );
563)     timerPlay.restart( );
564)   }
565) 
566)   //"Play Stop" was chosen from menu
567)   private void actionPlayStop( )
568)   {
569)     //stop play timer
570)     timerPlay.stop( );
571) 
572)     //enable start, disable stop
573)     menuPlayStart.setEnabled( true );
574)     menuPlayStop.setEnabled( false );
575)   }
576) 
577)   //play timer elapsed
578)   private void actionPlayTimer( )
579)   {
580)     int frameCnt, frameNoOld, frameNoNew;
581) 
582)     //stop play timer
583)     timerPlay.stop( );
584) 
585)     //get number of next frame
586)     frameCnt = curMovie.getFrameCnt( );
587)     frameNoOld = scrollFrames.getValue( );
588)     frameNoNew = frameNoOld + 1;
589)     if( frameNoNew >= frameCnt )
590)     {
591)       frameNoNew = 0;
592)       //stop playing if looping is not requested
593)       if( ! menuPlayLoop.getState( ) )
594)       {
595)         //enable start, disable stop
596)         menuPlayStart.setEnabled( true );
597)         menuPlayStop.setEnabled( false );
598)         return;
599)       }
600)     }
601) 
602)     //show next frame
603)     if( frameNoNew != frameNoOld ) //value changes
604)       scrollFrames.setValue( frameNoNew ); //play timer will be started again when frame is being shown by scrollbar callback
605)     else //value does not change
606)       stateFrames( ); //value does not change, no event will be sent, execute callback by hand
607)   }
608) 
609)   //"Help About" was chosen from menu
610)   private void actionHelpAbout( )
611)   {
612)     JOptionPane.showMessageDialog( dialogParent,
613)                                    "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

614)                                    "version 0.3 date 2004-11-12\n" +
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

1248)     curMovie.insertInfo( 0, "creator", "Blimp (version 0.3 date 2004-11-12)" );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

1687)     int i;
1688)     BlinkenMovie movie;
1689)     Pattern sizePattern, dimPattern;
1690)     Matcher sizeMatcher, dimMatcher;
1691)     String txtOld, txtNew;
1692) 
1693)     //running interactively - without arguments
1694)     if( args.length <= 0 )
1695)     {
1696)       javax.swing.SwingUtilities.invokeLater( new Blimp( null ) );
1697)       return;
1698)     }
1699) 
1700)     //running interactively - load initial file
1701)     if( args.length == 1 && ! args[0].substring( 0, 1 ).equals( "-" ) )
1702)     {
1703)       javax.swing.SwingUtilities.invokeLater( new Blimp( args[0] ) );
1704)       return;
1705)     }
1706) 
1707)     //running as command line tool
1708)     System.out.println( "BlinkenLightsInteractiveMovieProgram\n" +
1709)                         "version 0.3 date 2004-11-12\n" +
1710)                         "Copyright (C) 2004: Stefan Schuermans <1stein@schuermans.info>\n" +
1711)                         "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
1712)                         "a blinkenarea.org project\n" +
1713)                         "powered by eventphone.de\n" );
1714) 
1715)     //initialize patterns
1716)     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
1717)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
1718) 
1719)     //get initial movie
1720)     movie = new BlinkenMovie( 0, 0, 0, 0 );
1721) 
1722)     //process parameters
1723)     for( i = 0; i < args.length; i++ )
1724)     {
1725) 
1726)       if( args[i].equals( "-h" ) || args[i].equals( "--help" ) )
1727)       {
1728)         System.out.println( "interactive movie editor:\n" +
1729)                             "  java Blimp [<initial-file>]\n" +
1730)                             "\n" +
1731)                             "command line tool:\n" +
1732)                             "  java Blimp <parameter> [<parameter> [...]]\n" +
1733)                             "parameters:\n" +
1734)                             "  -i / --input <file>                                  load movie\n" +
1735)                             "  -r / --resize <width>x<height>-<channels>/<colors>   resize movie\n" +
1736)                             "  -s / --scale <width>x<height>                        scale movie\n" +
1737)                             "  -o / --output <file>                                 save movie\n" +
1738)                             "\n" );
1739)       }
1740) 
1741)       else if( args[i].equals( "-i" ) || args[i].equals( "--input" ) )
1742)       {
1743)         if( i + 1 >= args.length )
1744)         {
1745)           System.out.println( "parameter \"-i\" / \"--input\" requires an argument" );
1746)           break;
1747)         }
1748)         i++;
1749)         if( ! movie.load( args[i] ) )
1750)         {
1751)           System.out.println( "movie \"" + args[i] +  "\" could not be loaded..." );
1752)           break;
1753)         }
1754)         System.out.println( "movie \"" + args[i] +  "\" was loaded successfully..." );
1755)       }
1756) 
1757)       else if( args[i].equals( "-r" ) || args[i].equals( "--resize" ) )
1758)       {
1759)         if( i + 1 >= args.length )
1760)         {
1761)           System.out.println( "parameter \"-r\" / \"--resize\" requires an argument" );
1762)           break;
1763)         }
1764)         i++;
1765)         txtOld = movie.getWidth( ) + "x" +
1766)                  movie.getHeight( ) + "-" + 
1767)                  movie.getChannels( ) + "/" + 
1768)                  (movie.getMaxval( ) + 1);
1769)         if( ! (sizeMatcher = sizePattern.matcher( args[i] )).find( ) )
1770)         {
1771)           System.out.println( "invalid format \"" + args[i] + "\"of size (<width>x<height>-<channles>/<colors>)" );
1772)           break;
1773)         }
1774)         movie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
1775)                       Integer.parseInt( sizeMatcher.group( 1 ) ),
1776)                       Integer.parseInt( sizeMatcher.group( 3 ) ),
1777)                       Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
1778)         txtNew = movie.getWidth( ) + "x" +
1779)                  movie.getHeight( ) + "-" + 
1780)                  movie.getChannels( ) + "/" + 
1781)                  (movie.getMaxval( ) + 1);
1782)         System.out.println( "resized movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1783)       }
1784) 
1785)       else if( args[i].equals( "-s" ) || args[i].equals( "--scale" ) )
1786)       {
1787)         if( i + 1 >= args.length )
1788)         {
1789)           System.out.println( "parameter \"-s\" / \"--scale\" requires an argument" );
1790)           break;
1791)         }
1792)         i++;
1793)         txtOld = movie.getWidth( ) + "x" +
1794)                  movie.getHeight( );
1795)         if( ! (dimMatcher = dimPattern.matcher( args[i] )).find( ) )
1796)         {
1797)           System.out.println( "invalid format \"" + args[i] + "\" of dimension (<width>x<height>)" );
1798)           break;
1799)         }
1800)         movie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
1801)                      Integer.parseInt( dimMatcher.group( 1 ) ) );
1802)         txtNew = movie.getWidth( ) + "x" +
1803)                  movie.getHeight( );
1804)         System.out.println( "scaled movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
1805)       }
1806) 
1807)       else if( args[i].equals( "-o" ) || args[i].equals( "--output" ) )
1808)       {
1809)         if( i + 1 >= args.length )
1810)         {
1811)           System.out.println( "parameter \"-o\" / \"--output\" requires an argument" );
1812)           break;
1813)         }
1814)         i++;
1815)         if( ! movie.save( args[i] ) )
1816)         {
1817)           System.out.println( "movie \"" + args[i] +  "\" could not be saved..." );
1818)           break;
1819)         }
1820)         System.out.println( "movie \"" + args[i] +  "\" was saved successfully..." );
1821)       }
1822) 
1823)       else
1824)         System.out.println( "unknown parameter \"" + args[i] + "\" - use \"-h\" or \"--help\" to get help" );
1825) 
1826)     } //for( i...