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

Christian Heimke authored 13 years ago

1) /* BlinkenLightsInteractiveMovieProgram
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

2)  * version 1.2.1 date 2006-08-01
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

34) 
35)   //GUI elements
36)   JFrame frame; //main window (if running as full application)
37)   Component dialogParent; //parent to use for dialogs
38)   JMenuBar menubar; //menubar in main window
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

39)   JMenu menuFile, menuInfo, menuEdit, menuFrameSel, menuPlay, menuHelp; //menus
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

40)   JMenuItem menuFileNew, menuFileLoad, menuFileSave, menuFileSaveAs, menuFileQuit;
41)   JMenuItem menuInfoShow, menuInfoAdd, menuInfoDelete;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

42)   JMenuItem menuEditResize, menuEditScale;
43)   JMenuItem menuEditInsertFrame, menuEditDuplicateFrame, menuEditDeleteFrame;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

44)   JMenuItem menuFrameSelNone, menuFrameSelSingle, menuFrameSelStart, menuFrameSelEnd;
45)   JMenuItem menuFrameSelCopy, menuFrameSelMove, menuFrameSelReverse, menuFrameSelDelete;
46)   JMenuItem menuEditImportImages, menuEditImportMovie;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

51)   JPanel panelMiddleFrame, panelFrame, panelDuration, panelColors;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

52)   JLabel labelStatus, labelFrames, labelSelFrames, labelFrameInfo, labelDuration;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

53)   JScrollBar scrollFrames;
54)   JSlider sliderFrameZoom;
55)   BlinkenFrameEditor frameEditor;
56)   JScrollPane scrollpaneFrame;
57)   JTextField textDuration;
58)   JPanel panelOuterTools, panelMiddleTools, panelTools, panelActions;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

59)   JPanel panelOuterEdit, panelMiddleEdit, panelEdit;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

60)   JToggleButton buttonToolsNone, buttonToolsColorPicker, buttonToolsDot, buttonToolsLine;
61)   JToggleButton buttonToolsRect, buttonToolsFilledRect, buttonToolsCircle, buttonToolsFilledCircle;
62)   JToggleButton buttonToolsCopy, buttonToolsPaste;
63)   ButtonGroup groupTools;
64)   JButton buttonActionsInvert, buttonActionsRotate90, buttonActionsRotate180, buttonActionsRotate270;
65)   JButton buttonActionsMirrorHor, buttonActionsMirrorVer, buttonActionsMirrorDiag, buttonActionsMirrorDiag2;
66)   JButton buttonActionsRollLeft, buttonActionsRollRight, buttonActionsRollUp, buttonActionsRollDown;
67)   JButton buttonActionsUndo, buttonActionsRedo;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

68)   JButton buttonEditInsertFrame, buttonEditDuplicateFrame, buttonEditDeleteFrame;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

69)   JPanel panelColorsChoose, panelColorsSettings, panelColorsColor, panelColorsAlpha;
70)   JToggleButton buttonsColor[];
71)   ButtonGroup groupColor;
72)   JLabel labelColorsColor, labelColorsAlpha;
73)   JButton buttonColorsColor;
74)   JSlider sliderColorsAlpha;
75)   JTextField textColorsColor, textColorsAlpha;
76) 
77)   //other variables
78)   int colorIdx; //index of selected color
79)   Color colors[]; //current colors
80)   ImageIcon iconsColor[], iconColorsColor; //color icons shown in color panel 
81)   javax.swing.Timer timerPlay; //timer used for playing movies
82) 
83)   //file, movie, frame
84)   File curDir = null, curFile = null; //current directory and file
85)   BlinkenMovie curMovie = null; //current movie
86)   boolean curMovieChanged = false; //if changes have been made to current movie
87)   BlinkenFrame curFrame = null; //current frame
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

88)   int frameSelStart = -1, frameSelEnd = -1; //selected frames (none selected yet)
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

89) 
90)   //constructor for applet
91)   public Blimp( )
92)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

94)   }
95) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

152)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

153)     curMovie.insertInfo( 0, "creator", "Blimp (version 1.2.1 date 2006-08-01)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

154)     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

155)     curMovieChanged = false;
156) 
157)     //update controls
158)     updateFrames( 0 );
159)   }
160) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

391)                                           "     104x80-1/128     (TROIA floor + ceiling)\n" +
392)                                           "     98x7-1/128     (bluebox)\n\n" +
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

393)                                           "Please enter the new movie size:",
394)                                           "Blimp - Resize Movie...",
395)                                           JOptionPane.QUESTION_MESSAGE,
396)                                           null, null, size );
397)       //dialog was cancelled
398)       if( size == null )
399)         return;
400)     }
401)     while( ! (sizeMatcher = sizePattern.matcher( size.toString( ) )).find( ) ); //repeat question if answer not valid
402) 
403)     //resize movie
404)     curMovie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
405)                      Integer.parseInt( sizeMatcher.group( 1 ) ),
406)                      Integer.parseInt( sizeMatcher.group( 3 ) ),
407)                      Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
408)     curMovieChanged = true;
409) 
410)     //update controls
411)     updateFrames( scrollFrames.getValue( ) );
412) 
413)     //update status
414)     labelStatus.setText( "movie resized successfully to " + size.toString( ) + "..." );
415)   }
416) 
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

417)   //"Edit Scale Movie..." was chosen from menu
418)   private void actionEditScale( )
419)   {
420)     Pattern dimPattern;
421)     String curDim, curSize;
422)     Object dim;
423)     Matcher dimMatcher;
424) 
425)     //initialize dimension pattern
426)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
427) 
428)     //get string with current movie size
429)     curDim = curMovie.getWidth( ) + "x" +
430)              curMovie.getHeight( );
431)     curSize = curMovie.getWidth( ) + "x" +
432)               curMovie.getHeight( ) + "-" + 
433)               curMovie.getChannels( ) + "/" + 
434)               (curMovie.getMaxval( ) + 1);
435) 
436)     //ask until cancel or answer is valid
437)     dim = curDim;
438)     do
439)     {
440)       //ask for new size
441)       dim = JOptionPane.showInputDialog( dialogParent,
442)                                          "Current movie dimension is:   " + curDim + " (" + curSize + ")\n\n" +
443)                                          "The format is:   <width>x<height>\n" + 
444)                                          "     18x8     (Blinkenlights, Blinkenlights Reloaded)\n" + 
445)                                          "     26x20     (Blinkenlights Arcade)\n" + 
446)                                          "     104x32     (TROIA big walls)\n" + 
447)                                          "     80x32     (TROIA small walls)\n" + 
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

448)                                          "     104x80     (TROIA floor + ceiling)\n" +
449)                                          "     98x7     (bluebox)\n\n" +
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

450)                                          "Please enter the new movie dimension:",
451)                                          "Blimp - Scale Movie...",
452)                                          JOptionPane.QUESTION_MESSAGE,
453)                                          null, null, dim );
454)       //dialog was cancelled
455)       if( dim == null )
456)         return;
457)     }
458)     while( ! (dimMatcher = dimPattern.matcher( dim.toString( ) )).find( ) ); //repeat question if answer not valid
459) 
460)     //scale movie
461)     curMovie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
462)                     Integer.parseInt( dimMatcher.group( 1 ) ) );
463)     curMovieChanged = true;
464) 
465)     //update controls
466)     updateFrames( scrollFrames.getValue( ) );
467) 
468)     //update status
469)     labelStatus.setText( "movie scaled successfully to " + dim.toString( ) + "..." );
470)   }
471) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

472)   //"Edit Insert Frame" was chosen from menu / Insert Frame button was pressed
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

473)   private void actionEditInsertFrame( )
474)   {
475)     BlinkenFrame frame;
476)     int frameCnt, frameNo;
477) 
478)     //create new empty frame
479)     frame = new BlinkenFrame( curMovie.getHeight( ), curMovie.getWidth( ),
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

481)     frame.clear( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

482)     //copy duration if there is a current frame
483)     if( curFrame != null )
484)       frame.setDuration( curFrame.getDuration( ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

485) 
486)     //insert frame behind current position
487)     frameCnt = curMovie.getFrameCnt( );
488)     frameNo = scrollFrames.getValue( ) + 1;
489)     if( frameNo < 0 )
490)       frameNo = 0;
491)     if( frameNo > frameCnt )
492)       frameNo = frameCnt;
493)     curMovie.insertFrame( frameNo, frame );
494)     curMovieChanged = true;
495) 
496)     //update controls
497)     updateFrames( frameNo );
498)   }
499) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

500)   //"Edit Duplicate Frame" was chosen from menu / Duplicate Frame button was pressed
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

501)   private void actionEditDuplicateFrame( )
502)   {
503)     BlinkenFrame frame;
504)     int frameCnt, frameNo;
505) 
506)     //do nothing if there is no current frame
507)     if( curFrame == null )
508)       return;
509) 
510)     //duplicate current frame
511)     frame = new BlinkenFrame( curFrame );
512) 
513)     //insert frame behind current position
514)     frameCnt = curMovie.getFrameCnt( );
515)     frameNo = scrollFrames.getValue( ) + 1;
516)     if( frameNo < 0 )
517)       frameNo = 0;
518)     if( frameNo > frameCnt )
519)       frameNo = frameCnt;
520)     curMovie.insertFrame( frameNo, frame );
521)     curMovieChanged = true;
522) 
523)     //update controls
524)     updateFrames( frameNo );
525)   }
526) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

527)   //"Edit Delete Frame" was chosen from menu / Delete Frame button was pressed
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

528)   private void actionEditDeleteFrame( )
529)   {
530)     int frameNo;
531) 
532)     //do nothing if there is no current frame
533)     if( curFrame == null )
534)       return;
535) 
536)     //delete current frame
537)     frameNo = scrollFrames.getValue( );
538)     curMovie.deleteFrame( frameNo );
539)     frameNo--;
540)     curMovieChanged = true;
541) 
542)     //update controls
543)     updateFrames( frameNo );
544)   }
545) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

546)   //"Edit Import Images..." was chosen from menu
547)   private void actionEditImportImages( )
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

548)   {
549)     JFileChooser fileChooser;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

550)     File files[];
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

551)     ImageIcon icon;
552)     Image image;
553)     BufferedImage bufferedImage;
554)     BlinkenFrame frame;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

555)     int width, height, x, y, i, frameCnt, frameNo;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

556) 
557)     //show file select dialog
558)     fileChooser = new JFileChooser( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

559)     fileChooser.setDialogTitle( "Blimp - Import Images..." );
560)     fileChooser.setMultiSelectionEnabled( true );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

561)     if( curDir != null )
562)       fileChooser.setCurrentDirectory( curDir );
563)     if( fileChooser.showOpenDialog( dialogParent ) != JFileChooser.APPROVE_OPTION ) //not successful
564)       return;
565)     //save current directory
566)     curDir = fileChooser.getCurrentDirectory( );
567) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

568)     //get selected files
569)     files = fileChooser.getSelectedFiles( );
570)     for( i = 0; i < files.length; i++ )
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

571)     {
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

572) 
573)       //load image
574)       icon = new ImageIcon( files[i].getPath( ) );
575)       if( icon == null )
576)       {
577)         labelStatus.setText( "could not import image \"" + files[i].getPath( ) +  "\"..." );
578)         break;
579)       }
580)       width = icon.getIconWidth( );
581)       height = icon.getIconHeight( );
582)       image = icon.getImage( );
583)       if( width <= 0 || height <= 0 || image == null )
584)       {
585)         labelStatus.setText( "could not import image \"" + files[i].getPath( ) +  "\"..." );
586)         break;
587)       }
588)       //convert image to a buffered one
589)       bufferedImage = new BufferedImage( width, height, BufferedImage.TYPE_INT_ARGB );
590)       bufferedImage.getGraphics( ).drawImage( image, 0, 0, width, height, null );
591)     
592)       //create new empty frame
593)       frame = new BlinkenFrame( height, width,
594)                                 curMovie.getChannels( ), curMovie.getMaxval( ), defDuration );
595)       height = frame.getHeight( ); //dimensions might have been invalid and thus been adapted
596)       width = frame.getWidth( );
597)       frame.clear( );
598)       //copy duration if there is a current frame
599)       if( curFrame != null )
600)         frame.setDuration( curFrame.getDuration( ) );
601)     
602)       //put pixels of image into frame
603)       for( y = 0; y < height; y++ )
604)         for( x = 0; x < width; x++ )
605)           frame.setColor( y, x, new Color( bufferedImage.getRGB( x, y ) ) );
606)     
607)       //insert frame behind current position
608)       frameCnt = curMovie.getFrameCnt( );
609)       frameNo = scrollFrames.getValue( ) + 1;
610)       if( frameNo < 0 )
611)         frameNo = 0;
612)       if( frameNo > frameCnt )
613)         frameNo = frameCnt;
614)       curMovie.insertFrame( frameNo, frame ); //this resizes the frame to fit the movie dimensions
615)       curMovieChanged = true;
616) 
617)       //show status message
618)       labelStatus.setText( "image \"" + files[i].getPath( ) +  "\" was successfully imported..." );
619) 
620)       //update controls
621)       updateFrames( frameNo );
622)     }
623)   }
624) 
625)   //"Edit Import Movie..." was chosen from menu
626)   private void actionEditImportMovie( )
627)   {
628)     JFileChooser fileChooser;
629)     BlinkenMovie movie;
630)     BlinkenFrame frame;
631)     int frameCnt, frameNo, cnt, i;
632) 
633)     //show file select dialog
634)     fileChooser = new JFileChooser( );
635)     fileChooser.setDialogTitle( "Blimp - Import Movie..." );
636)     fileChooser.setFileFilter( new BlinkenFileFilter( ) );
637)     if( curDir != null )
638)       fileChooser.setCurrentDirectory( curDir );
639)     if( fileChooser.showOpenDialog( dialogParent ) != JFileChooser.APPROVE_OPTION ) //not successful
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

640)       return;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

641)     //save current directory
642)     curDir = fileChooser.getCurrentDirectory( );
643) 
644)     //load movie
645)     movie = new BlinkenMovie( 0, 0, 0, 0 );
646)     if( ! movie.load( fileChooser.getSelectedFile( ).getPath( ) ) )
647)     {
648)       //some error
649)       labelStatus.setText( "movie \"" + fileChooser.getSelectedFile( ).getPath( ) +  "\" could not be imported..." );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

650)     }
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

651) 
652)     //insert frames of movie behind current position
653)     frameCnt = curMovie.getFrameCnt( );
654)     frameNo = scrollFrames.getValue( ) + 1;
655)     if( frameNo < 0 )
656)       frameNo = 0;
657)     if( frameNo > frameCnt )
658)       frameNo = frameCnt;
659)     cnt = movie.getFrameCnt( );
660)     for( i = 0; i < cnt; i++ )
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

661)     {
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

662)       frame = new BlinkenFrame( movie.getFrame( i ) );
663)       curMovie.insertFrame( frameNo + i, frame ); //this resizes the frame to fit the movie dimensions
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

664)     }
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

665)     curMovieChanged = true;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

666) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

667)     //success
668)     labelStatus.setText( "movie \"" + fileChooser.getSelectedFile( ).getPath( ) +  "\" was successfully imported..." );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

669) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

670)     //update controls
671)     updateFrames( frameNo );
672)   }
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

673) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

674)   //"Frame-Selection Select None" was chosen from menu
675)   private void actionFrameSelNone( )
676)   {
677)     //remove frame selection
678)     frameSelStart = -1;
679)     frameSelEnd = -1;
680)     stateFrameSel( );
681)   }
682) 
683)   //"Frame-Selection Select Single Frame" was chosen from menu
684)   private void actionFrameSelSingle( )
685)   {
686)     //do nothing if there is no current frame
687)     if( curFrame == null )
688)       return;
689) 
690)     //select current frame
691)     frameSelStart = scrollFrames.getValue( );
692)     frameSelEnd = frameSelStart;
693)     stateFrameSel( );
694)   }
695) 
696)   //"Frame-Selection Start of Selection" was chosen from menu
697)   private void actionFrameSelStart( )
698)   {
699)     //do nothing if there is no current frame
700)     if( curFrame == null )
701)       return;
702) 
703)     //set start of frame selection to current frame
704)     frameSelStart = scrollFrames.getValue( );
705)     if( frameSelEnd >= curMovie.getFrameCnt( ) || frameSelEnd < frameSelStart )
706)       frameSelEnd = frameSelStart;
707)     stateFrameSel( );
708)   }
709) 
710)   //"Frame-Selection End of Selection" was chosen from menu
711)   private void actionFrameSelEnd( )
712)   {
713)     //do nothing if there is no current frame
714)     if( curFrame == null )
715)       return;
716) 
717)     //set end of frame selection to current frame
718)     frameSelEnd = scrollFrames.getValue( );
719)     if( frameSelStart < 0 || frameSelStart > frameSelEnd )
720)       frameSelStart = frameSelEnd;
721)     stateFrameSel( );
722)   }
723) 
724)   //"Frame-Selection Copy" was chosen from menu
725)   private void actionFrameSelCopy( )
726)   {
727)     int frameCnt, frameNo, cnt, i;
728) 
729)     //do nothing if selection is invalid
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

730)     frameCnt = curMovie.getFrameCnt( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

731)     if( 0 > frameSelStart || frameSelStart > frameSelEnd || frameSelEnd >= frameCnt )
732)       return;
733) 
734)     //get copies of selected frames
735)     cnt = frameSelEnd - frameSelStart + 1;
736)     BlinkenFrame frames[] = new BlinkenFrame[cnt];
737)     for( i = 0; i < cnt; i++ )
738)       frames[i] = new BlinkenFrame( curMovie.getFrame( frameSelStart + i ) );
739) 
740)     //insert frames behind current position
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

741)     frameNo = scrollFrames.getValue( ) + 1;
742)     if( frameNo < 0 )
743)       frameNo = 0;
744)     if( frameNo > frameCnt )
745)       frameNo = frameCnt;
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

746)     for( i = 0; i < cnt; i++ )
747)       curMovie.insertFrame( frameNo + i, frames[i] );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

748)     curMovieChanged = true;
749) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

750)     //update controls
751)     updateFrames( frameNo );
752) 
753)     //select newly inserted frames
754)     frameSelStart = frameNo;
755)     frameSelEnd = frameSelStart + cnt - 1;
756)     stateFrameSel( );
757)   }
758) 
759)   //"Frame-Selection Move" was chosen from menu
760)   private void actionFrameSelMove( )
761)   {
762)     int frameCnt, frameNo, cnt, i;
763) 
764)     //do nothing if selection is invalid
765)     frameCnt = curMovie.getFrameCnt( );
766)     if( 0 > frameSelStart || frameSelStart > frameSelEnd || frameSelEnd >= frameCnt )
767)       return;
768) 
769)     //get selected frames
770)     cnt = frameSelEnd - frameSelStart + 1;
771)     BlinkenFrame frames[] = new BlinkenFrame[cnt];
772)     for( i = 0; i < cnt; i++ )
773)       frames[i] = curMovie.getFrame( frameSelStart + i );
774) 
775)     //delete selected frames
776)     for( i = 0; i < cnt; i++ )
777)       curMovie.deleteFrame( frameSelStart );
778) 
779)     //update number of frames and current position
780)     frameCnt -= cnt; //cnt frames were deleted
781)     frameNo = scrollFrames.getValue( ); //old position
782)     if( frameNo > frameSelEnd ) //was behind last frame of selection
783)       frameNo -= cnt;
784)     else if( frameNo >= frameSelStart) //was in selection
785)       frameNo = frameSelStart - 1;
786) 
787)     //insert frames behind current position
788)     frameNo++;
789)     if( frameNo < 0 )
790)       frameNo = 0;
791)     if( frameNo > frameCnt )
792)       frameNo = frameCnt;
793)     for( i = 0; i < cnt; i++ )
794)       curMovie.insertFrame( frameNo + i, frames[i] );
795)     curMovieChanged = true;
796) 
797)     //update controls
798)     updateFrames( frameNo );
799) 
800)     //select moved frames
801)     frameSelStart = frameNo;
802)     frameSelEnd = frameSelStart + cnt - 1;
803)     stateFrameSel( );
804)   }
805) 
806)   //"Frame-Selection Reverse" was chosen from menu
807)   private void actionFrameSelReverse( )
808)   {
809)     int frameCnt, frameNo, cnt, i;
810) 
811)     //do nothing if selection is invalid
812)     frameCnt = curMovie.getFrameCnt( );
813)     if( 0 > frameSelStart || frameSelStart > frameSelEnd || frameSelEnd >= frameCnt )
814)       return;
815) 
816)     //get selected frames
817)     cnt = frameSelEnd - frameSelStart + 1;
818)     BlinkenFrame frames[] = new BlinkenFrame[cnt];
819)     for( i = 0; i < cnt; i++ )
820)       frames[i] = curMovie.getFrame( frameSelStart + i );
821) 
822)     //delete selected frames
823)     for( i = 0; i < cnt; i++ )
824)       curMovie.deleteFrame( frameSelStart );
825) 
826)     //insert selected frames in reverse order
827)     for( i = 0; i < cnt; i++ )
828)       curMovie.insertFrame( frameSelStart, frames[i] );
829)     curMovieChanged = true;
830) 
831)     //update controls - go to reversed frames
832)     frameNo = frameSelStart;
833)     updateFrames( frameNo );
834) 
835)     //select reversed frames
836)     frameSelStart = frameNo;
837)     frameSelEnd = frameSelStart + cnt - 1;
838)     stateFrameSel( );
839)   }
840) 
841)   //"Frame-Selection Delete" was chosen from menu
842)   private void actionFrameSelDelete( )
843)   {
844)     int frameCnt, frameNo, cnt, i;
845) 
846)     //do nothing if selection is invalid
847)     frameCnt = curMovie.getFrameCnt( );
848)     if( 0 > frameSelStart || frameSelStart > frameSelEnd || frameSelEnd >= frameCnt )
849)       return;
850) 
851)     //delete selected frames
852)     cnt = frameSelEnd - frameSelStart + 1;
853)     for( i = 0; i < cnt; i++ )
854)       curMovie.deleteFrame( frameSelStart );
855)     curMovieChanged = true;
856) 
857)     //update number of frames and current position
858)     frameCnt -= cnt; //cnt frames were deleted
859)     frameNo = scrollFrames.getValue( ); //old position
860)     if( frameNo > frameSelEnd ) //was behind last frame of selection
861)       frameNo -= cnt;
862)     else if( frameNo >= frameSelStart) //was in selection
863)       frameNo = frameSelStart - 1;
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

864) 
865)     //update controls
866)     updateFrames( frameNo );
867)   }
868) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

869)   //"Play Start" was chosen from menu
870)   private void actionPlayStart( )
871)   {
872)     //select no tool
873)     buttonToolsNone.setSelected( true );
874)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
875) 
876)     //disable start, enable stop
877)     menuPlayStart.setEnabled( false );
878)     menuPlayStop.setEnabled( true );
879) 
880)     //stop old play timer
881)     timerPlay.stop( );
882) 
883)     //if play shall start from beginning
884)     if( menuPlayBegin.getState( ) )
885)     {
886)       //show first frame
887)       if( scrollFrames.getValue( ) != 0 ) //value changes
888)         scrollFrames.setValue( 0 ); //play timer will be started again when frame is being shown by scrollbar callback
889)       else //value does not change
890)         stateFrames( ); //value does not change, no event will be sent, execute callback by hand
891)     }
892) 
893)     //start play timer
894)     if( curFrame == null )
895)       timerPlay.setInitialDelay( 100 ); //use 100ms as default
896)     else
897)       timerPlay.setInitialDelay( curFrame.getDuration( ) );
898)     timerPlay.restart( );
899)   }
900) 
901)   //"Play Stop" was chosen from menu
902)   private void actionPlayStop( )
903)   {
904)     //stop play timer
905)     timerPlay.stop( );
906) 
907)     //enable start, disable stop
908)     menuPlayStart.setEnabled( true );
909)     menuPlayStop.setEnabled( false );
910)   }
911) 
912)   //play timer elapsed
913)   private void actionPlayTimer( )
914)   {
915)     int frameCnt, frameNoOld, frameNoNew;
916) 
917)     //stop play timer
918)     timerPlay.stop( );
919) 
920)     //get number of next frame
921)     frameCnt = curMovie.getFrameCnt( );
922)     frameNoOld = scrollFrames.getValue( );
923)     frameNoNew = frameNoOld + 1;
924)     if( frameNoNew >= frameCnt )
925)     {
926)       frameNoNew = 0;
927)       //stop playing if looping is not requested
928)       if( ! menuPlayLoop.getState( ) )
929)       {
930)         //enable start, disable stop
931)         menuPlayStart.setEnabled( true );
932)         menuPlayStop.setEnabled( false );
933)         return;
934)       }
935)     }
936) 
937)     //show next frame
938)     if( frameNoNew != frameNoOld ) //value changes
939)       scrollFrames.setValue( frameNoNew ); //play timer will be started again when frame is being shown by scrollbar callback
940)     else //value does not change
941)       stateFrames( ); //value does not change, no event will be sent, execute callback by hand
942)   }
943) 
944)   //"Help About" was chosen from menu
945)   private void actionHelpAbout( )
946)   {
947)     JOptionPane.showMessageDialog( dialogParent,
948)                                    "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

949)                                    "version 1.2.1 date 2006-08-01\n" +
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

951)                                    "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
952)                                    "a blinkenarea.org project\n" +
953)                                    "powered by eventphone.de",
954)                                    "Blimp - About...",
955)                                    JOptionPane.INFORMATION_MESSAGE );
956)   }
957) 
958)   //update frames controls (and go to certaint frame)
959)   private void updateFrames( int frameNo )
960)   {
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

961)     int frameCnt;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

962) 
963)     //update frames scrollbar range
964)     frameCnt = curMovie.getFrameCnt( );
965)     if( frameCnt <= 0 )
966)     {
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

967)       frameNo = 0;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

968)       scrollFrames.setValues( 0, 0, 0, 0 );
969)     }
970)     else
971)     {
972)       if( frameNo < 0 )
973)         frameNo = 0;
974)       if( frameNo >= frameCnt )
975)         frameNo = frameCnt - 1;
976)       scrollFrames.setValues( frameNo, 1, 0, frameCnt );
977)     }
978) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

979)     //select no frames
980)     frameSelStart = -1;
981)     frameSelEnd = -1;
982)     stateFrameSel( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

983) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

984)     //enable/disable some menu commands and buttons which need a current frame
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

985)     menuEditDuplicateFrame.setEnabled( frameCnt > 0 );
986)     menuEditDeleteFrame.setEnabled( frameCnt > 0 );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

987)     buttonEditDuplicateFrame.setEnabled( frameCnt > 0 );
988)     buttonEditDeleteFrame.setEnabled( frameCnt > 0 );
989)     menuFrameSelSingle.setEnabled( frameCnt > 0 );
990)     menuFrameSelStart.setEnabled( frameCnt > 0 );
991)     menuFrameSelEnd.setEnabled( frameCnt > 0 );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

992)   }
993) 
994)   //frames scrollbar changed
995)   private void stateFrames( )
996)   {
997)     int frameCnt, frameNo;
998) 
999)     //update frames scrollbar label
1000)     frameCnt = curMovie.getFrameCnt( );
1001)     if( frameCnt <= 0 )
1002)     {
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1003)       frameNo = 0;
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1004)       labelFrames.setText( "frame: -/0" );
1005)       curFrame = null;
1006)     }
1007)     else
1008)     {
1009)       frameNo = scrollFrames.getValue( );
1010)       labelFrames.setText( "frame: " + (frameNo + 1) + "/" + frameCnt );
1011)       curFrame = curMovie.getFrame( frameNo );
1012)     }
1013) 
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1014)     //update selected frames label
1015)     if( 0 > frameSelStart || frameSelStart > frameSelEnd || frameSelEnd >= frameCnt )
1016)       labelSelFrames.setText( "selected: -/-" );
1017)     else if( frameSelStart > frameNo )
1018)       labelSelFrames.setText( "selected: -/" + (frameSelEnd - frameSelStart + 1) );
1019)     else if( frameNo > frameSelEnd )
1020)       labelSelFrames.setText( "selected: +/" + (frameSelEnd - frameSelStart + 1) );
1021)     else
1022)       labelSelFrames.setText( "selected: " + (frameNo - frameSelStart + 1) + "/" + (frameSelEnd - frameSelStart + 1) );
1023) 
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1024)     //update frame
1025)     frameEditor.setFrame( curFrame );
1026) 
1027)     //show duration
1028)     showDuration( );
1029) 
1030)     //if currently playing
1031)     if( ! menuPlayStart.isEnabled( ) )
1032)     {
1033)       //stop play timer
1034)       timerPlay.stop( );
1035)       //start play timer
1036)       if( curFrame == null )
1037)         timerPlay.setInitialDelay( 100 ); //use 100ms as default
1038)       else
1039)         timerPlay.setInitialDelay( curFrame.getDuration( ) );
1040)       timerPlay.restart( );
1041)     }
1042)   }
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1043)   
1044)   //frame selection changed
1045)   private void stateFrameSel( )
1046)   {
1047)     boolean valid;
1048)     int frameCnt;
1049) 
1050)     //simulate frames scrollbar change to propagate update
1051)     stateFrames( );
1052) 
1053)     //check if selection is valid
1054)     frameCnt = curMovie.getFrameCnt( );
1055)     valid = (0 <= frameSelStart && frameSelStart <= frameSelEnd && frameSelEnd < frameCnt);
1056) 
1057)     //enable/disable some menu commands which need a selection
1058)     menuFrameSelCopy.setEnabled( valid );
1059)     menuFrameSelMove.setEnabled( valid );
1060)     menuFrameSelReverse.setEnabled( valid );
1061)     menuFrameSelDelete.setEnabled( valid );
1062)   }
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1063) 
1064)   //frame zoom changed
1065)   private void stateFrameZoom( )
1066)   {
1067)     //update frame
1068)     frameEditor.setZoom( sliderFrameZoom.getValue( ) );
1069)   }
1070) 
1071)   //show duration
1072)   private void showDuration( )
1073)   {
1074)     if( curFrame == null )
1075)     {
1076)       textDuration.setEnabled( false );
1077)       textDuration.setText( "" );
1078)     }
1079)     else
1080)     {
1081)       textDuration.setEnabled( true );
1082)       textDuration.setText( "" + curFrame.getDuration( ) );
1083)     }
1084)   }
1085) 
1086)   //new frame duration is being entered
1087)   private void changeDuration( )
1088)   {
1089)     int duration;
1090) 
1091)     try
1092)     {
1093)       //get new frame duration
1094)       duration = Integer.parseInt( textDuration.getText( ) );
1095) 
1096)       //write new duration into frame (if it really changed)
1097)       if( curFrame != null && curFrame.getDuration( ) != duration )
1098)       {
1099)         curFrame.setDuration( duration );
1100)         curMovieChanged = true;
1101)       }
1102)     }
1103)     catch( NumberFormatException e ) { }
1104)   }
1105) 
1106)   //new frame duration was entered
1107)   private void validateDuration( )
1108)   {
1109)     //process changes made to duration
1110)     changeDuration( );
1111) 
1112)     //redisplay new duration
1113)     showDuration( );
1114)   }
1115) 
1116)   //generate a color icon from a color
1117)   private void iconFromColor( ImageIcon icon, Color color )
1118)   {
1119)     int height, width, y, x;
1120)     boolean yy, xx;
1121)     Graphics graphics;
1122) 
1123)     //get size
1124)     height = icon.getIconHeight( );
1125)     width = icon.getIconWidth( );
1126) 
1127)     //get graphics context of icon's image
1128)     graphics = icon.getImage( ).getGraphics( );
1129) 
1130)     //draw background
1131)     graphics.setColor( new Color( color.getRed( ), color.getGreen( ), color.getBlue( ) ) );
1132)     graphics.fillRect( 0, 0, width / 2, height );
1133)     for( y = 0, yy = false; y < height; y += height / 4, yy = ! yy )
1134)     {
1135)       for( x = width / 2, xx = yy; x < width; x += width / 6, xx = ! xx )
1136)       {
1137)         if( xx )
1138)           graphics.setColor( Color.white );
1139)         else
1140)           graphics.setColor( Color.black );
1141)         graphics.fillRect( x, y, width / 6, height / 4 );
1142)       }
1143)     }
1144) 
1145)     //draw foreground in specified color
1146)     graphics.setColor( color );
1147)     graphics.fillRect( 0, 0, width, height );
1148)   }
1149) 
1150)   //a color was chosen
1151)   private void actionColorIdx( int idx )
1152)   {
1153)     //click on active color
1154)     if( idx == colorIdx )
1155)     {
1156)       //act as if color color select button was pressed
1157)       actionColorsColor( );
1158)       return;
1159)     }
1160) 
1161)     //set active color index
1162)     colorIdx = idx;
1163) 
1164)     //update color settings
1165)     showColorsColor( );
1166)     showColorsAlpha( );
1167) 
1168)     //set color of frame editor to new color
1169)     frameEditor.setColor( colors[colorIdx] );
1170)   }
1171) 
1172)   //show color
1173)   private void showColorsColor( )
1174)   {
1175)     int red, green, blue;
1176)     String hex;
1177) 
1178)     //get color components
1179)     red = colors[colorIdx].getRed( );
1180)     green = colors[colorIdx].getGreen( );
1181)     blue = colors[colorIdx].getBlue( );
1182) 
1183)     //color button
1184)     iconFromColor( iconColorsColor, new Color( red, green, blue ) );
1185)     buttonColorsColor.repaint( );
1186) 
1187)     //color text
1188)     if( red < 0x10 )
1189)       hex = "0" + Integer.toHexString( red );
1190)     else
1191)       hex = Integer.toHexString( red );
1192)     if( green < 0x10 )
1193)       hex += "0" + Integer.toHexString( green );
1194)     else
1195)       hex += Integer.toHexString( green );
1196)     if( blue < 0x10 )
1197)       hex += "0" + Integer.toHexString( blue );
1198)     else
1199)       hex += Integer.toHexString( blue );
1200)     textColorsColor.setText( hex.toUpperCase( ) );
1201)   }
1202) 
1203)   //color select button was pressed
1204)   private void actionColorsColor( )
1205)   {
1206)     Color color;
1207) 
1208)     //get current color with full alpha
1209)     color = new Color( colors[colorIdx].getRed( ),
1210)                        colors[colorIdx].getGreen( ),
1211)                        colors[colorIdx].getBlue( ) );
1212)     
1213)     //show color select dialog
1214)     color = JColorChooser.showDialog( dialogParent,
1215)                                       "Blimp - Choose Color...",
1216)                                       color );
1217)     if( color == null ) //dialog was cancelled
1218)       return;
1219) 
1220)     //save new color
1221)     colors[colorIdx] = new Color( color.getRed( ),
1222)                                   color.getGreen( ),
1223)                                   color.getBlue( ),
1224)                                   colors[colorIdx].getAlpha( ) );
1225) 
1226)     //redisplay new color
1227)     showColorsColor( );
1228) 
1229)     //update color icon of active color
1230)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1231)     buttonsColor[colorIdx].repaint( );
1232) 
1233)     //set color of frame editor to new color
1234)     frameEditor.setColor( colors[colorIdx] );
1235)   }
1236) 
1237)   //new color text is being entered
1238)   private void changeColorsColor( )
1239)   {
1240)     String txt;
1241)     int red, green, blue;
1242) 
1243)     //get color text
1244)     txt = textColorsColor.getText( );
1245) 
1246)     //standard color is black
1247)     red = 0;
1248)     green = 0;
1249)     blue = 0;
1250) 
1251)     //get new color
1252)     try
1253)     {
1254)       if( txt.length( ) >= 2 )
1255)         red = Integer.parseInt( txt.substring( 0, 2 ), 0x10 );
1256)       if( txt.length( ) >= 4 )
1257)         green = Integer.parseInt( txt.substring( 2, 4 ), 0x10 );
1258)       if( txt.length( ) >= 6 )
1259)         blue = Integer.parseInt( txt.substring( 4, 6 ), 0x10 );
1260)     }
1261)     catch( NumberFormatException e ) { }
1262) 
1263)     //save new color
1264)     colors[colorIdx] = new Color( red, green, blue, colors[colorIdx].getAlpha( ) );
1265) 
1266)     //set color of frame editor to new color
1267)     frameEditor.setColor( colors[colorIdx] );
1268)   }
1269) 
1270)   //new color text was entered
1271)   private void validateColorsColor( )
1272)   {
1273)     //process changes
1274)     changeColorsColor( );
1275) 
1276)     //redisplay new color
1277)     showColorsColor( );
1278) 
1279)     //update color icon of active color
1280)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1281)     buttonsColor[colorIdx].repaint( );
1282)   }
1283) 
1284)   //show color's alpha value
1285)   private void showColorsAlpha( )
1286)   {
1287)     int alpha;
1288)     String hex;
1289) 
1290)     //get alpha value
1291)     alpha = colors[colorIdx].getAlpha( );
1292) 
1293)     //alpha slider
1294)     sliderColorsAlpha.setValue( alpha );
1295) 
1296)     //alpha text
1297)     if( alpha < 0x10 )
1298)       hex = "0" + Integer.toHexString( alpha );
1299)     else
1300)       hex = Integer.toHexString( alpha );
1301)     textColorsAlpha.setText( hex.toUpperCase( ) );
1302)   }
1303) 
1304)   //color's alpha value changed
1305)   private void stateColorsAlpha( )
1306)   {
1307)     int alpha;
1308)     String hex;
1309) 
1310)     //get new alpha value
1311)     alpha = sliderColorsAlpha.getValue( );
1312) 
1313)     //update active color
1314)     colors[colorIdx] = new Color( colors[colorIdx].getRed( ),
1315)                                   colors[colorIdx].getGreen( ),
1316)                                   colors[colorIdx].getBlue( ),
1317)                                   alpha );
1318) 
1319)     //update alpha text
1320)     if( alpha < 0x10 )
1321)       hex = "0" + Integer.toHexString( alpha );
1322)     else
1323)       hex = Integer.toHexString( alpha );
1324)     textColorsAlpha.setText( hex.toUpperCase( ) );
1325) 
1326)     //update color icon of active color
1327)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1328)     buttonsColor[colorIdx].repaint( );
1329) 
1330)     //set color of frame editor to new color
1331)     frameEditor.setColor( colors[colorIdx] );
1332)   }
1333) 
1334)   //new alpha text is being entered
1335)   private void changeColorsAlpha( )
1336)   {
1337)     String txt;
1338)     int alpha;
1339) 
1340)     //get alpha text
1341)     txt = textColorsAlpha.getText( );
1342) 
1343)     //standard alpha is full
1344)     alpha = 255;
1345) 
1346)     //get new alpha
1347)     try
1348)     {
1349)       if( txt.length( ) >= 2 )
1350)         alpha = Integer.parseInt( txt.substring( 0, 2 ), 0x10 );
1351)     }
1352)     catch( NumberFormatException e ) { }
1353) 
1354)     //save new alpha
1355)     colors[colorIdx] = new Color( colors[colorIdx].getRed( ),
1356)                                   colors[colorIdx].getGreen( ),
1357)                                   colors[colorIdx].getBlue( ),
1358)                                   alpha );
1359) 
1360)     //set color of frame editor to new color
1361)     frameEditor.setColor( colors[colorIdx] );
1362)   }
1363) 
1364)   //new alpha text was entered
1365)   private void validateColorsAlpha( )
1366)   {
1367)     //process changes
1368)     changeColorsAlpha( );
1369) 
1370)     //redisplay new alpha value
1371)     showColorsAlpha( );
1372) 
1373)     //update color icon of active color
1374)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1375)     buttonsColor[colorIdx].repaint( );
1376)   }
1377) 
1378)   public void windowActivated( WindowEvent e )
1379)   {
1380)   }
1381) 
1382)   public void windowDeactivated( WindowEvent e )
1383)   {
1384)   }
1385) 
1386)   public void windowOpened( WindowEvent e )
1387)   {
1388)   }
1389) 
1390)   public void windowClosing( WindowEvent e )
1391)   {
1392)     actionFileQuit( ); //act as "File Quit"
1393)   }
1394) 
1395)   public void windowClosed( WindowEvent e )
1396)   { 
1397)   }
1398) 
1399)   public void windowIconified( WindowEvent e )
1400)   {
1401)   }
1402) 
1403)   public void windowDeiconified( WindowEvent e )
1404)   {
1405)   }
1406) 
1407)   //some GUI action was perfomed
1408)   public void actionPerformed( ActionEvent e )
1409)   {
1410)     int i;
1411) 
1412)     if( e.getSource( ) == menuFileNew )
1413)       actionFileNew( );
1414)     else if( e.getSource( ) == menuFileLoad )
1415)       actionFileLoad( );
1416)     else if( e.getSource( ) == menuFileSave )
1417)       actionFileSave( );
1418)     else if( e.getSource( ) == menuFileSaveAs )
1419)       actionFileSaveAs( );
1420)     else if( e.getSource( ) == menuFileQuit )
1421)       actionFileQuit( );
1422)     else if( e.getSource( ) == menuInfoShow )
1423)       actionInfoShow( );
1424)     else if( e.getSource( ) == menuInfoAdd )
1425)       actionInfoAdd( );
1426)     else if( e.getSource( ) == menuInfoDelete )
1427)       actionInfoDelete( );
1428)     else if( e.getSource( ) == menuEditResize )
1429)       actionEditResize( );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

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

Christian Heimke authored 13 years ago

1432)     else if( e.getSource( ) == menuEditInsertFrame )
1433)       actionEditInsertFrame( );
1434)     else if( e.getSource( ) == menuEditDuplicateFrame )
1435)       actionEditDuplicateFrame( );
1436)     else if( e.getSource( ) == menuEditDeleteFrame )
1437)       actionEditDeleteFrame( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1438)     else if( e.getSource( ) == menuEditImportImages )
1439)       actionEditImportImages( );
1440)     else if( e.getSource( ) == menuEditImportMovie )
1441)       actionEditImportMovie( );
1442)     else if( e.getSource( ) == menuFrameSelNone )
1443)       actionFrameSelNone( );
1444)     else if( e.getSource( ) == menuFrameSelSingle )
1445)       actionFrameSelSingle( );
1446)     else if( e.getSource( ) == menuFrameSelStart )
1447)       actionFrameSelStart( );
1448)     else if( e.getSource( ) == menuFrameSelEnd )
1449)       actionFrameSelEnd( );
1450)     else if( e.getSource( ) == menuFrameSelCopy )
1451)       actionFrameSelCopy( );
1452)     else if( e.getSource( ) == menuFrameSelMove )
1453)       actionFrameSelMove( );
1454)     else if( e.getSource( ) == menuFrameSelReverse )
1455)       actionFrameSelReverse( );
1456)     else if( e.getSource( ) == menuFrameSelDelete )
1457)       actionFrameSelDelete( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1458)     else if( e.getSource( ) == menuPlayStart )
1459)       actionPlayStart( );
1460)     else if( e.getSource( ) == menuPlayStop )
1461)       actionPlayStop( );
1462)     else if( e.getSource( ) == timerPlay )
1463)       actionPlayTimer( );
1464)     else if( e.getSource( ) == menuHelpAbout )
1465)       actionHelpAbout( );
1466)     else if( e.getSource( ) == textDuration )
1467)       validateDuration( );
1468)     else if( e.getSource( ) == buttonToolsNone )
1469)       frameEditor.setTool( BlinkenFrameEditor.toolNone );
1470)     else if( e.getSource( ) == buttonToolsColorPicker )
1471)       frameEditor.setTool( BlinkenFrameEditor.toolColorPicker );
1472)     else if( e.getSource( ) == buttonToolsDot )
1473)       frameEditor.setTool( BlinkenFrameEditor.toolDot );
1474)     else if( e.getSource( ) == buttonToolsLine )
1475)       frameEditor.setTool( BlinkenFrameEditor.toolLine );
1476)     else if( e.getSource( ) == buttonToolsRect )
1477)       frameEditor.setTool( BlinkenFrameEditor.toolRect );
1478)     else if( e.getSource( ) == buttonToolsFilledRect )
1479)       frameEditor.setTool( BlinkenFrameEditor.toolFilledRect );
1480)     else if( e.getSource( ) == buttonToolsCircle )
1481)       frameEditor.setTool( BlinkenFrameEditor.toolCircle );
1482)     else if( e.getSource( ) == buttonToolsFilledCircle )
1483)       frameEditor.setTool( BlinkenFrameEditor.toolFilledCircle );
1484)     else if( e.getSource( ) == buttonToolsCopy )
1485)       frameEditor.setTool( BlinkenFrameEditor.toolCopy );
1486)     else if( e.getSource( ) == buttonToolsPaste )
1487)       frameEditor.setTool( BlinkenFrameEditor.toolPaste );
1488)     else if( e.getSource( ) == buttonActionsInvert )
1489)       frameEditor.actionInvert( );
1490)     else if( e.getSource( ) == buttonActionsRotate90 )
1491)       frameEditor.actionRotate90( );
1492)     else if( e.getSource( ) == buttonActionsRotate180 )
1493)       frameEditor.actionRotate180( );
1494)     else if( e.getSource( ) == buttonActionsRotate270 )
1495)       frameEditor.actionRotate270( );
1496)     else if( e.getSource( ) == buttonActionsMirrorHor )
1497)       frameEditor.actionMirrorHor( );
1498)     else if( e.getSource( ) == buttonActionsMirrorVer )
1499)       frameEditor.actionMirrorVer( );
1500)     else if( e.getSource( ) == buttonActionsMirrorDiag )
1501)       frameEditor.actionMirrorDiag( );
1502)     else if( e.getSource( ) == buttonActionsMirrorDiag2 )
1503)       frameEditor.actionMirrorDiag2( );
1504)     else if( e.getSource( ) == buttonActionsRollLeft )
1505)       frameEditor.actionRollLeft( );
1506)     else if( e.getSource( ) == buttonActionsRollRight )
1507)       frameEditor.actionRollRight( );
1508)     else if( e.getSource( ) == buttonActionsRollUp )
1509)       frameEditor.actionRollUp( );
1510)     else if( e.getSource( ) == buttonActionsRollDown )
1511)       frameEditor.actionRollDown( );
1512)     else if( e.getSource( ) == buttonActionsUndo )
1513)       frameEditor.actionUndo( );
1514)     else if( e.getSource( ) == buttonActionsRedo )
1515)       frameEditor.actionRedo( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1516)     else if( e.getSource( ) == buttonEditInsertFrame )
1517)       actionEditInsertFrame( );
1518)     else if( e.getSource( ) == buttonEditDuplicateFrame )
1519)       actionEditDuplicateFrame( );
1520)     else if( e.getSource( ) == buttonEditDeleteFrame )
1521)       actionEditDeleteFrame( );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1522)     else if( e.getSource( ) == buttonColorsColor )
1523)       actionColorsColor( );
1524)     else if( e.getSource( ) == textColorsColor )
1525)       validateColorsColor( );
1526)     else if( e.getSource( ) == textColorsAlpha )
1527)       validateColorsAlpha( );
1528)     else
1529)     {
1530)       for( i = 0; i < constColorCnt; i++ )
1531)         if( e.getSource( ) == buttonsColor[i] )
1532)           break;
1533)       if( i < constColorCnt )
1534)         actionColorIdx( i );
1535)     }
1536)   }
1537) 
1538)   //some GUI value was adjusted
1539)   public void adjustmentValueChanged( AdjustmentEvent e )
1540)   {
1541)     if( e.getSource( ) == scrollFrames )
1542)       stateFrames( );
1543)   }
1544) 
1545)   //some GUI state changed
1546)   public void stateChanged( ChangeEvent e )
1547)   {
1548)     if( e.getSource( ) == sliderFrameZoom )
1549)       stateFrameZoom( );
1550)     else if( e.getSource( ) == sliderColorsAlpha )
1551)       stateColorsAlpha( );
1552)   }
1553) 
1554)   //a control got the focus
1555)   public void focusGained( FocusEvent e )
1556)   {
1557)   }
1558) 
1559)   //a control lost the focus
1560)   public void focusLost( FocusEvent e )
1561)   {
1562)     if( e.getSource( ) == textDuration )
1563)       validateDuration( );
1564)     else if( e.getSource( ) == textColorsColor )
1565)       validateColorsColor( );
1566)     else if( e.getSource( ) == textColorsAlpha )
1567)       validateColorsAlpha( );
1568)   }
1569) 
1570)   //something was changed in a document
1571)   public void changedUpdate( DocumentEvent e )
1572)   {
1573)     if( e.getDocument( ) == textDuration.getDocument( ) )
1574)       changeDuration( );
1575)     else if( e.getDocument( ) == textColorsColor.getDocument( ) )
1576)       changeColorsColor( );
1577)     else if( e.getDocument( ) == textColorsAlpha.getDocument( ) )
1578)       changeColorsAlpha( );
1579)   }
1580) 
1581)   //something was inserted into a document
1582)   public void insertUpdate( DocumentEvent e )
1583)   {
1584)     if( e.getDocument( ) == textDuration.getDocument( ) )
1585)       changeDuration( );
1586)   }
1587) 
1588)   //something was removed from a document
1589)   public void removeUpdate( DocumentEvent e )
1590)   {
1591)     if( e.getDocument( ) == textDuration.getDocument( ) )
1592)       changeDuration( );
1593)   }
1594) 
1595)   //info text of frame editor changed
1596)   public void blinkenFrameEditorInfo( String info )
1597)   {
1598)     labelFrameInfo.setText( info );
1599)   }
1600) 
1601)   //a color was picked in the frame editor
1602)   public void blinkenFrameEditorColorPicked( Color color )
1603)   {
1604)     //save new color
1605)     colors[colorIdx] = color;
1606) 
1607)     //redisplay new color (incl. alpha)
1608)     showColorsColor( );
1609)     showColorsAlpha( );
1610) 
1611)     //update color icon of active color
1612)     iconFromColor( iconsColor[colorIdx], colors[colorIdx] );
1613)     buttonsColor[colorIdx].repaint( );
1614) 
1615)     //set color of frame editor to new color
1616)     frameEditor.setColor( colors[colorIdx] );
1617)   }
1618) 
1619)   //the current frame was changed in the frame editor
1620)   public void blinkenFrameEditorFrameChanged( )
1621)   {
1622)     curMovieChanged = true;
1623)   }
1624) 
1625)   //the possibility to perfon an undo or redo operation changed
1626)   public void blinkenFrameEditorCanUndoRedo( boolean canUndo, boolean canRedo )
1627)   {
1628)     buttonActionsUndo.setEnabled( canUndo );
1629)     buttonActionsRedo.setEnabled( canRedo );
1630)   }
1631) 
1632)   //entry point of main thread
1633)   public void run( )
1634)   {
1635)     int i, val;
1636)     Dimension size;
1637)     Insets smallMargin;
1638) 
1639)     //initialize current movie, frame
1640)     curDir = new File( "." );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1641)     curMovie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

1642)     curMovie.insertInfo( 0, "creator", "Blimp (version 1.2.1 date 2006-08-01)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

1643)     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

1644)     curFrame = null;
1645) 
1646)     //runnning as full application
1647)     if( isFullApp )
1648)     {
1649)       //create main window
1650)       JFrame.setDefaultLookAndFeelDecorated( true );
1651)       frame = new JFrame( "Blimp" );
1652)       frame.setDefaultCloseOperation( JFrame.DO_NOTHING_ON_CLOSE );
1653)       frame.addWindowListener( this );
1654)       //create menu bar
1655)       menubar = new JMenuBar( );
1656)       frame.setJMenuBar( menubar );
1657)       //create main panel
1658)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1659)       frame.getContentPane( ).add( panel );
1660)       //use main window as parent for dialogs
1661)       dialogParent = frame;
1662)     }
1663)     //runnning as applet
1664)     else
1665)     {
1666)       //no main window - applet is main window
1667)       frame = null;
1668)       //create menu bar
1669)       menubar = new JMenuBar( );
1670)       setJMenuBar( menubar );
1671)       //create main panel
1672)       panel = new JPanel( new BorderLayout( 5, 5 ) );
1673)       getContentPane( ).add( panel );
1674)       //use applet as parent for dialogs
1675)       dialogParent = this;
1676)     }
1677) 
1678)     //create menus
1679)     //file menu
1680)     menuFile = new JMenu( "File" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1681)     menuFile.setMnemonic( KeyEvent.VK_F );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1682)     menubar.add( menuFile );
1683)     menuFileNew = new JMenuItem( "New" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1684)     menuFileNew.setMnemonic( KeyEvent.VK_N );
1685)     menuFileNew.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_N, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1686)     menuFileNew.addActionListener( this );
1687)     menuFile.add( menuFileNew );
1688)     menuFileLoad = new JMenuItem( "Load..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1689)     menuFileLoad.setMnemonic( KeyEvent.VK_L );
1690)     menuFileLoad.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_L, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1691)     menuFileLoad.addActionListener( this );
1692)     menuFile.add( menuFileLoad );
1693)     menuFileSave = new JMenuItem( "Save" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1694)     menuFileSave.setMnemonic( KeyEvent.VK_S );
1695)     menuFileSave.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_S, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1696)     menuFileSave.addActionListener( this );
1697)     menuFile.add( menuFileSave );
1698)     menuFileSaveAs = new JMenuItem( "Save as..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1699)     menuFileSaveAs.setMnemonic( KeyEvent.VK_A );
1700)     menuFileSaveAs.setDisplayedMnemonicIndex( 5 );
1701)     menuFileSaveAs.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_A, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1702)     menuFileSaveAs.addActionListener( this );
1703)     menuFile.add( menuFileSaveAs );
1704)     if( isFullApp )
1705)       menuFile.addSeparator( );
1706)     menuFileQuit = new JMenuItem( "Quit" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1707)     menuFileQuit.setMnemonic( KeyEvent.VK_Q );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1708)     menuFileQuit.addActionListener( this );
1709)     if( isFullApp )
1710)       menuFile.add( menuFileQuit );
1711)     //information menu
1712)     menuInfo = new JMenu( "Information" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1713)     menuInfo.setMnemonic( KeyEvent.VK_I );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1714)     menubar.add( menuInfo );
1715)     menuInfoShow = new JMenuItem( "Show..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1716)     menuInfoShow.setMnemonic( KeyEvent.VK_S );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1717)     menuInfoShow.addActionListener( this );
1718)     menuInfo.add( menuInfoShow );
1719)     menuInfoAdd = new JMenuItem( "Add..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1720)     menuInfoAdd.setMnemonic( KeyEvent.VK_A );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1721)     menuInfoAdd.addActionListener( this );
1722)     menuInfo.add( menuInfoAdd );
1723)     menuInfoDelete = new JMenuItem( "Delete..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1724)     menuInfoDelete.setMnemonic( KeyEvent.VK_D );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1725)     menuInfoDelete.addActionListener( this );
1726)     menuInfo.add( menuInfoDelete );
1727)     //edit menu
1728)     menuEdit = new JMenu( "Edit" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1729)     menuEdit.setMnemonic( KeyEvent.VK_E );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1730)     menubar.add( menuEdit );
1731)     menuEditResize = new JMenuItem( "Resize Movie..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1732)     menuEditResize.setMnemonic( KeyEvent.VK_R );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1733)     menuEditResize.addActionListener( this );
1734)     menuEdit.add( menuEditResize );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1735)     menuEditScale = new JMenuItem( "Scale Movie..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1736)     menuEditScale.setMnemonic( KeyEvent.VK_S );
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

1737)     menuEditScale.addActionListener( this );
1738)     menuEdit.add( menuEditScale );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1739)     menuEdit.addSeparator( );
1740)     menuEditInsertFrame = new JMenuItem( "Insert Frame" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1741)     menuEditInsertFrame.setMnemonic( KeyEvent.VK_I );
1742)     menuEditInsertFrame.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_I, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1743)     menuEditInsertFrame.addActionListener( this );
1744)     menuEdit.add( menuEditInsertFrame );
1745)     menuEditDuplicateFrame = new JMenuItem( "Duplicate Frame" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1746)     menuEditDuplicateFrame.setMnemonic( KeyEvent.VK_D );
1747)     menuEditDuplicateFrame.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_D, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1748)     menuEditDuplicateFrame.setEnabled( false );
1749)     menuEditDuplicateFrame.addActionListener( this );
1750)     menuEdit.add( menuEditDuplicateFrame );
1751)     menuEditDeleteFrame = new JMenuItem( "Delete Frame" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1752)     menuEditDeleteFrame.setMnemonic( KeyEvent.VK_L );
1753)     menuEditDeleteFrame.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_X, KeyEvent.CTRL_MASK ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1754)     menuEditDeleteFrame.setEnabled( false );
1755)     menuEditDeleteFrame.addActionListener( this );
1756)     menuEdit.add( menuEditDeleteFrame );
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

1757)     menuEdit.addSeparator( );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1758)     menuEditImportImages = new JMenuItem( "Import Images..." );
1759)     menuEditImportImages.setMnemonic( KeyEvent.VK_P );
1760)     menuEditImportImages.setDisplayedMnemonicIndex( 7 );
1761)     menuEditImportImages.addActionListener( this );
1762)     menuEdit.add( menuEditImportImages );
1763)     menuEditImportMovie = new JMenuItem( "Import Movie..." );
1764)     menuEditImportMovie.setMnemonic( KeyEvent.VK_M );
1765)     menuEditImportMovie.setDisplayedMnemonicIndex( 7 );
1766)     menuEditImportMovie.addActionListener( this );
1767)     menuEdit.add( menuEditImportMovie );
1768)     //frame selection menu
1769)     menuFrameSel = new JMenu( "Frame-Selection" );
1770)     menuFrameSel.setMnemonic( KeyEvent.VK_S );
1771)     menubar.add( menuFrameSel );
1772)     menuFrameSelNone = new JMenuItem( "Select None" );
1773)     menuFrameSelNone.setMnemonic( KeyEvent.VK_N );
1774)     menuFrameSelNone.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_N, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1775)     menuFrameSelNone.addActionListener( this );
1776)     menuFrameSel.add( menuFrameSelNone );
1777)     menuFrameSelSingle = new JMenuItem( "Select Single Frame" );
1778)     menuFrameSelSingle.setMnemonic( KeyEvent.VK_F );
1779)     menuFrameSelSingle.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_F, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1780)     menuFrameSelSingle.setEnabled( false );
1781)     menuFrameSelSingle.addActionListener( this );
1782)     menuFrameSel.add( menuFrameSelSingle );
1783)     menuFrameSelStart = new JMenuItem( "Start of Selection" );
1784)     menuFrameSelStart.setMnemonic( KeyEvent.VK_S );
1785)     menuFrameSelStart.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_S, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1786)     menuFrameSelStart.setEnabled( false );
1787)     menuFrameSelStart.addActionListener( this );
1788)     menuFrameSel.add( menuFrameSelStart );
1789)     menuFrameSelEnd = new JMenuItem( "End of Selection" );
1790)     menuFrameSelEnd.setMnemonic( KeyEvent.VK_E );
1791)     menuFrameSelEnd.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_E, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1792)     menuFrameSelEnd.setEnabled( false );
1793)     menuFrameSelEnd.addActionListener( this );
1794)     menuFrameSel.add( menuFrameSelEnd );
1795)     menuFrameSel.addSeparator( );
1796)     menuFrameSelCopy = new JMenuItem( "Copy" );
1797)     menuFrameSelCopy.setMnemonic( KeyEvent.VK_C );
1798)     menuFrameSelCopy.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_C, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1799)     menuFrameSelCopy.setEnabled( false );
1800)     menuFrameSelCopy.addActionListener( this );
1801)     menuFrameSel.add( menuFrameSelCopy );
1802)     menuFrameSelMove = new JMenuItem( "Move" );
1803)     menuFrameSelMove.setMnemonic( KeyEvent.VK_M );
1804)     menuFrameSelMove.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_M, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1805)     menuFrameSelMove.setEnabled( false );
1806)     menuFrameSelMove.addActionListener( this );
1807)     menuFrameSel.add( menuFrameSelMove );
1808)     menuFrameSelReverse = new JMenuItem( "Reverse" );
1809)     menuFrameSelReverse.setMnemonic( KeyEvent.VK_R );
1810)     menuFrameSelReverse.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_R, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1811)     menuFrameSelReverse.setEnabled( false );
1812)     menuFrameSelReverse.addActionListener( this );
1813)     menuFrameSel.add( menuFrameSelReverse );
1814)     menuFrameSelDelete = new JMenuItem( "Delete" );
1815)     menuFrameSelDelete.setMnemonic( KeyEvent.VK_L );
1816)     menuFrameSelDelete.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_X, KeyEvent.CTRL_MASK | KeyEvent.SHIFT_MASK ) );
1817)     menuFrameSelDelete.setEnabled( false );
1818)     menuFrameSelDelete.addActionListener( this );
1819)     menuFrameSel.add( menuFrameSelDelete );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1820)     //play menu
1821)     menuPlay = new JMenu( "Play" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1822)     menuPlay.setMnemonic( KeyEvent.VK_P );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1823)     menubar.add( menuPlay );
1824)     menuPlayStart = new JMenuItem( "Start" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1825)     menuPlayStart.setMnemonic( KeyEvent.VK_S );
1826)     menuPlayStart.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_F11, 0 ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1827)     menuPlayStart.addActionListener( this );
1828)     menuPlay.add( menuPlayStart );
1829)     menuPlayStop = new JMenuItem( "Stop" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1830)     menuPlayStop.setMnemonic( KeyEvent.VK_P );
1831)     menuPlayStop.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_F12, 0 ) );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1832)     menuPlayStop.setEnabled( false );
1833)     menuPlayStop.addActionListener( this );
1834)     menuPlay.add( menuPlayStop );
1835)     menuPlay.addSeparator( );
1836)     menuPlayBegin = new JCheckBoxMenuItem( "From Begin", false );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1837)     menuPlayBegin.setMnemonic( KeyEvent.VK_B );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1838)     menuPlayBegin.addActionListener( this );
1839)     menuPlay.add( menuPlayBegin );
1840)     menuPlayLoop = new JCheckBoxMenuItem( "Looped", false );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1841)     menuPlayLoop.setMnemonic( KeyEvent.VK_L );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1842)     menuPlayLoop.addActionListener( this );
1843)     menuPlay.add( menuPlayLoop );
1844)     //help menu
1845)     menuHelp = new JMenu( "Help" );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1846)     menuHelp.setMnemonic( KeyEvent.VK_H );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1847)     menubar.add( menuHelp );
1848)     menuHelpAbout = new JMenuItem( "About..." );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1849)     menuHelpAbout.setMnemonic( KeyEvent.VK_A );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1850)     menuHelpAbout.addActionListener( this );
1851)     menuHelp.add( menuHelpAbout );
1852) 
1853)     //create controls
1854)     smallMargin = new Insets( 1, 1, 1, 1 );
1855)     panel.setBorder( new EmptyBorder( 5, 5, 5, 5 ) );
1856)     //status bar
1857)     panelStatus = new JPanel( new BorderLayout( 5, 5 ) );
1858)     panel.add( panelStatus, BorderLayout.SOUTH );
1859)     panelStatus.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.NORTH );
1860)     labelStatus = new JLabel( "ready..." );
1861)     panelStatus.add( labelStatus, BorderLayout.CENTER );
1862)     //main panel
1863)     panelMain = new JPanel( new BorderLayout( 5, 5 ) );
1864)     panel.add( panelMain, BorderLayout.CENTER );
1865)     //frames panel
1866)     panelFrames = new JPanel( new BorderLayout( 5, 5 ) );
1867)     panelMain.add( panelFrames, BorderLayout.SOUTH );
1868)     scrollFrames = new JScrollBar( SwingConstants.HORIZONTAL, 0, 0, 0, 0 );
1869)     scrollFrames.addAdjustmentListener( this );
1870)     panelFrames.add( scrollFrames, BorderLayout.CENTER );
1871)     labelFrames = new JLabel( "frame: -/0" );
1872)     labelFrames.setLabelFor( scrollFrames );
1873)     panelFrames.add( labelFrames, BorderLayout.WEST );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1874)     labelSelFrames = new JLabel( "selected: -/-" );
1875)     labelSelFrames.setLabelFor( scrollFrames );
1876)     panelFrames.add( labelSelFrames, BorderLayout.EAST );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1877)     //outer and middle frame panel
1878)     panelOuterFrame = new JPanel( new BorderLayout( 5, 5 ) );
1879)     panelMain.add( panelOuterFrame, BorderLayout.CENTER );
1880)     panelOuterFrame.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1881)     panelMiddleFrame = new JPanel( new BorderLayout( 5, 5 ) );
1882)     panelOuterFrame.add( panelMiddleFrame, BorderLayout.CENTER );
1883)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.WEST );
1884)     panelMiddleFrame.add( new JSeparator( JSeparator.VERTICAL ), BorderLayout.EAST );
1885)     //frame panel
1886)     panelFrame = new JPanel( new BorderLayout( 5, 5 ) );
1887)     panelMiddleFrame.add( panelFrame, BorderLayout.CENTER );
1888)     sliderFrameZoom = new JSlider( JSlider.VERTICAL, 0, 6, 3 );
1889)     sliderFrameZoom.setSnapToTicks( true );
1890)     sliderFrameZoom.setInverted( true );
1891)     sliderFrameZoom.addChangeListener( this );
1892)     sliderFrameZoom.setToolTipText( "Zoom" );
1893)     panelFrame.add( sliderFrameZoom, BorderLayout.EAST );
1894)     frameEditor = new BlinkenFrameEditor( );
1895)     frameEditor.setZoom( sliderFrameZoom.getValue( ) );
1896)     scrollpaneFrame = new JScrollPane( frameEditor );
1897)     panelFrame.add( scrollpaneFrame, BorderLayout.CENTER );
1898)     labelFrameInfo = new JLabel( "", JLabel.CENTER );
1899)     labelFrameInfo.setLabelFor( frameEditor );
1900)     panelFrame.add( labelFrameInfo, BorderLayout.NORTH );
1901)     frameEditor.setEditorListener( this );
1902)     panelDuration = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 5 ) );
1903)     panelFrame.add( panelDuration, BorderLayout.SOUTH );
1904)     textDuration = new JTextField( 5 );
1905)     textDuration.setHorizontalAlignment( JTextField.CENTER );
1906)     textDuration.setEnabled( false );
1907)     textDuration.getDocument( ).addDocumentListener( this );
1908)     textDuration.addActionListener( this );
1909)     textDuration.addFocusListener( this );
1910)     labelDuration = new JLabel( "duration (ms): " );
1911)     labelDuration.setLabelFor( textDuration );
1912)     panelDuration.add( labelDuration );
1913)     panelDuration.add( textDuration );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1914)     //tool, action and edit panels
1915)     panelOuterEdit = new JPanel( new BorderLayout( 5, 5 ) );
1916)     panelOuterFrame.add( panelOuterEdit, BorderLayout.WEST );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1917)     panelOuterTools = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1918)     panelOuterEdit.add( panelOuterTools, BorderLayout.CENTER );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1919)     panelMiddleTools = new JPanel( new BorderLayout( 5, 5 ) );
1920)     panelOuterTools.add( panelMiddleTools );
1921)     panelTools = new JPanel( new GridLayout( 4, 3, 5, 5 ) );
1922)     panelMiddleTools.add( panelTools, BorderLayout.CENTER );
1923)     panelMiddleTools.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.SOUTH );
1924)     panelActions = new JPanel( new GridLayout( 5, 3, 5, 5 ) );
1925)     panelOuterTools.add( panelActions );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

1926)     panelMiddleEdit = new JPanel( new BorderLayout( 5, 5 ) );
1927)     panelOuterEdit.add( panelMiddleEdit, BorderLayout.SOUTH );
1928)     panelMiddleEdit.add( new JSeparator( JSeparator.HORIZONTAL ), BorderLayout.NORTH );
1929)     panelEdit = new JPanel( new GridLayout( 1, 3, 5, 5 ) );
1930)     panelMiddleEdit.add( panelEdit, BorderLayout.CENTER );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

1931)     //tool buttons
1932)     groupTools = new ButtonGroup( );
1933)     buttonToolsNone = new JToggleButton( );
1934)     buttonToolsNone.setMargin( smallMargin );
1935)     buttonToolsNone.setToolTipText( "no tool" );
1936)     buttonToolsNone.addActionListener( this );
1937)     groupTools.add( buttonToolsNone );
1938)     panelTools.add( buttonToolsNone );
1939)     buttonToolsColorPicker = new JToggleButton( loadImageIcon( "ColorPicker.png" ) );
1940)     buttonToolsColorPicker.setMargin( smallMargin );
1941)     buttonToolsColorPicker.setToolTipText( "Color Picker" );
1942)     buttonToolsColorPicker.addActionListener( this );
1943)     groupTools.add( buttonToolsColorPicker );
1944)     panelTools.add( buttonToolsColorPicker );
1945)     buttonToolsDot = new JToggleButton( loadImageIcon( "Dot.png" ) );
1946)     buttonToolsDot.setMargin( smallMargin );
1947)     buttonToolsDot.setToolTipText( "Dot" );
1948)     buttonToolsDot.addActionListener( this );
1949)     groupTools.add( buttonToolsDot );
1950)     panelTools.add( buttonToolsDot );
1951)     buttonToolsLine = new JToggleButton( loadImageIcon( "Line.png" ) );
1952)     buttonToolsLine.setMargin( smallMargin );
1953)     buttonToolsLine.setToolTipText( "Line" );
1954)     buttonToolsLine.addActionListener( this );
1955)     groupTools.add( buttonToolsLine );
1956)     panelTools.add( buttonToolsLine );
1957)     buttonToolsRect = new JToggleButton( loadImageIcon( "Rectangle.png" ) );
1958)     buttonToolsRect.setMargin( smallMargin );
1959)     buttonToolsRect.setToolTipText( "Rectangle" );
1960)     buttonToolsRect.addActionListener( this );
1961)     groupTools.add( buttonToolsRect );
1962)     panelTools.add( buttonToolsRect );
1963)     buttonToolsFilledRect = new JToggleButton( loadImageIcon( "FilledRectangle.png" ) );
1964)     buttonToolsFilledRect.setMargin( smallMargin );
1965)     buttonToolsFilledRect.setToolTipText( "Filled Rectangle" );
1966)     buttonToolsFilledRect.addActionListener( this );
1967)     groupTools.add( buttonToolsFilledRect );
1968)     panelTools.add( buttonToolsFilledRect );
1969)     panelTools.add( new JLabel( ) );
1970)     buttonToolsCircle = new JToggleButton( loadImageIcon( "Circle.png" ) );
1971)     buttonToolsCircle.setMargin( smallMargin );
1972)     buttonToolsCircle.setToolTipText( "Circle" );
1973)     buttonToolsCircle.addActionListener( this );
1974)     groupTools.add( buttonToolsCircle );
1975)     panelTools.add( buttonToolsCircle );
1976)     buttonToolsFilledCircle = new JToggleButton( loadImageIcon( "FilledCircle.png" ) );
1977)     buttonToolsFilledCircle.setMargin( smallMargin );
1978)     buttonToolsFilledCircle.setToolTipText( "Filled Circle" );
1979)     buttonToolsFilledCircle.addActionListener( this );
1980)     groupTools.add( buttonToolsFilledCircle );
1981)     panelTools.add( buttonToolsFilledCircle );
1982)     panelTools.add( new JLabel( ) );
1983)     buttonToolsCopy = new JToggleButton( loadImageIcon( "Copy.png" ) );
1984)     buttonToolsCopy.setMargin( smallMargin );
1985)     buttonToolsCopy.setToolTipText( "Copy" );
1986)     buttonToolsCopy.addActionListener( this );
1987)     groupTools.add( buttonToolsCopy );
1988)     panelTools.add( buttonToolsCopy );
1989)     buttonToolsPaste = new JToggleButton( loadImageIcon( "Paste.png" ) );
1990)     buttonToolsPaste.setMargin( smallMargin );
1991)     buttonToolsPaste.setToolTipText( "Paste" );
1992)     buttonToolsPaste.addActionListener( this );
1993)     groupTools.add( buttonToolsPaste );
1994)     panelTools.add( buttonToolsPaste );
1995)     buttonToolsNone.setSelected( true );
1996)     frameEditor.setTool( BlinkenFrameEditor.toolNone );
1997)     //action buttons
1998)     buttonActionsInvert = new JButton( loadImageIcon( "Invert.png" ) );
1999)     buttonActionsInvert.setMargin( smallMargin );
2000)     buttonActionsInvert.setToolTipText( "Invert" );
2001)     buttonActionsInvert.addActionListener( this );
2002)     panelActions.add( buttonActionsInvert );
2003)     buttonActionsMirrorHor = new JButton( loadImageIcon( "MirrorHor.png" ) );
2004)     buttonActionsMirrorHor.setMargin( smallMargin );
2005)     buttonActionsMirrorHor.setToolTipText( "Mirror Horizontally" );
2006)     buttonActionsMirrorHor.addActionListener( this );
2007)     panelActions.add( buttonActionsMirrorHor );
2008)     buttonActionsRollLeft = new JButton( loadImageIcon( "RollLeft.png" ) );
2009)     buttonActionsRollLeft.setMargin( smallMargin );
2010)     buttonActionsRollLeft.setToolTipText( "Roll Left" );
2011)     buttonActionsRollLeft.addActionListener( this );
2012)     panelActions.add( buttonActionsRollLeft );
2013)     buttonActionsRotate90 = new JButton( loadImageIcon( "Rotate90.png" ) );
2014)     buttonActionsRotate90.setMargin( smallMargin );
2015)     buttonActionsRotate90.setToolTipText( "Rotate 90 Degrees" );
2016)     buttonActionsRotate90.addActionListener( this );
2017)     panelActions.add( buttonActionsRotate90 );
2018)     buttonActionsMirrorVer = new JButton( loadImageIcon( "MirrorVer.png" ) );
2019)     buttonActionsMirrorVer.setMargin( smallMargin );
2020)     buttonActionsMirrorVer.setToolTipText( "Mirror Vertically" );
2021)     buttonActionsMirrorVer.addActionListener( this );
2022)     panelActions.add( buttonActionsMirrorVer );
2023)     buttonActionsRollRight = new JButton( loadImageIcon( "RollRight.png" ) );
2024)     buttonActionsRollRight.setMargin( smallMargin );
2025)     buttonActionsRollRight.setToolTipText( "Roll Right" );
2026)     buttonActionsRollRight.addActionListener( this );
2027)     panelActions.add( buttonActionsRollRight );
2028)     buttonActionsRotate180 = new JButton( loadImageIcon( "Rotate180.png" ) );
2029)     buttonActionsRotate180.setMargin( smallMargin );
2030)     buttonActionsRotate180.setToolTipText( "Rotate 180 Degrees" );
2031)     buttonActionsRotate180.addActionListener( this );
2032)     panelActions.add( buttonActionsRotate180 );
2033)     buttonActionsMirrorDiag = new JButton( loadImageIcon( "MirrorDiag.png" ) );
2034)     buttonActionsMirrorDiag.setMargin( smallMargin );
2035)     buttonActionsMirrorDiag.setToolTipText( "Mirror Diagonally (\\)" );
2036)     buttonActionsMirrorDiag.addActionListener( this );
2037)     panelActions.add( buttonActionsMirrorDiag );
2038)     buttonActionsRollUp = new JButton( loadImageIcon( "RollUp.png" ) );
2039)     buttonActionsRollUp.setMargin( smallMargin );
2040)     buttonActionsRollUp.setToolTipText( "Roll Up" );
2041)     buttonActionsRollUp.addActionListener( this );
2042)     panelActions.add( buttonActionsRollUp );
2043)     buttonActionsRotate270 = new JButton( loadImageIcon( "Rotate270.png" ) );
2044)     buttonActionsRotate270.setMargin( smallMargin );
2045)     buttonActionsRotate270.setToolTipText( "Rotate 270 Degrees" );
2046)     buttonActionsRotate270.addActionListener( this );
2047)     panelActions.add( buttonActionsRotate270 );
2048)     buttonActionsMirrorDiag2 = new JButton( loadImageIcon( "MirrorDiag2.png" ) );
2049)     buttonActionsMirrorDiag2.setMargin( smallMargin );
2050)     buttonActionsMirrorDiag2.setToolTipText( "Mirror Diagonally (/)" );
2051)     buttonActionsMirrorDiag2.addActionListener( this );
2052)     panelActions.add( buttonActionsMirrorDiag2 );
2053)     buttonActionsRollDown = new JButton( loadImageIcon( "RollDown.png" ) );
2054)     buttonActionsRollDown.setMargin( smallMargin );
2055)     buttonActionsRollDown.setToolTipText( "Roll Down" );
2056)     buttonActionsRollDown.addActionListener( this );
2057)     panelActions.add( buttonActionsRollDown );
2058)     panelActions.add( new JLabel( ) );
2059)     buttonActionsUndo = new JButton( loadImageIcon( "Undo.png" ) );
2060)     buttonActionsUndo.setMargin( smallMargin );
2061)     buttonActionsUndo.setToolTipText( "Undo" );
2062)     buttonActionsUndo.setEnabled( false );
2063)     buttonActionsUndo.addActionListener( this );
2064)     panelActions.add( buttonActionsUndo );
2065)     buttonActionsRedo = new JButton( loadImageIcon( "Redo.png" ) );
2066)     buttonActionsRedo.setMargin( smallMargin );
2067)     buttonActionsRedo.setToolTipText( "Redo" );
2068)     buttonActionsRedo.setEnabled( false );
2069)     buttonActionsRedo.addActionListener( this );
2070)     panelActions.add( buttonActionsRedo );
Christian Heimke Blimp v.1.1 (2005-04-16)

Christian Heimke authored 13 years ago

2071)     //edit buttons
2072)     buttonEditInsertFrame = new JButton( loadImageIcon( "InsertFrame.png" ) );
2073)     buttonEditInsertFrame.setMargin( smallMargin );
2074)     buttonEditInsertFrame.setToolTipText( "Insert Frame" );
2075)     buttonEditInsertFrame.addActionListener( this );
2076)     panelEdit.add( buttonEditInsertFrame );
2077)     buttonEditDuplicateFrame = new JButton( loadImageIcon( "DuplicateFrame.png" ) );
2078)     buttonEditDuplicateFrame.setMargin( smallMargin );
2079)     buttonEditDuplicateFrame.setToolTipText( "Duplicate Frame" );
2080)     buttonEditDuplicateFrame.addActionListener( this );
2081)     panelEdit.add( buttonEditDuplicateFrame );
2082)     buttonEditDeleteFrame = new JButton( loadImageIcon( "DeleteFrame.png" ) );
2083)     buttonEditDeleteFrame.setMargin( smallMargin );
2084)     buttonEditDeleteFrame.setToolTipText( "Delete Frame" );
2085)     buttonEditDeleteFrame.addActionListener( this );
2086)     panelEdit.add( buttonEditDeleteFrame );
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

2087)     //color panel
2088)     panelColors = new JPanel( new GridLayout( 2, 1, 5, 5 ) );
2089)     panelOuterFrame.add( panelColors, BorderLayout.EAST );
2090)     panelColorsChoose = new JPanel( new GridLayout( constColorCntY, constColorCntX, 5, 5 ) );
2091)     panelColors.add( panelColorsChoose );
2092)     buttonsColor = new JToggleButton[constColorCnt];
2093)     groupColor = new ButtonGroup( );
2094)     for( i = 0; i < constColorCnt; i++ )
2095)     {
2096)       buttonsColor[i] = new JToggleButton( );
2097)       buttonsColor[i].setMargin( smallMargin );
2098)       buttonsColor[i].addActionListener( this );
2099)       groupColor.add( buttonsColor[i] );
2100)       panelColorsChoose.add( buttonsColor[i] );
2101)     }
2102)     //color panel - settings
2103)     panelColorsSettings = new JPanel( new GridLayout( 4, 1, 5, 0 ) );
2104)     panelColors.add( panelColorsSettings );
2105)     labelColorsColor = new JLabel( "color:" );
2106)     labelColorsColor.setVerticalAlignment( JLabel.BOTTOM );
2107)     panelColorsSettings.add( labelColorsColor );
2108)     panelColorsColor = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
2109)     panelColorsSettings.add( panelColorsColor );
2110)     buttonColorsColor = new JButton( );
2111)     buttonColorsColor.setMargin( smallMargin );
2112)     buttonColorsColor.addActionListener( this );
2113)     panelColorsColor.add( buttonColorsColor );
2114)     textColorsColor = new JTextField( "FFFFFF", 6 );
2115)     textColorsColor.setHorizontalAlignment( JTextField.CENTER );
2116)     textColorsColor.addActionListener( this );
2117)     textColorsColor.addFocusListener( this );
2118)     panelColorsColor.add( textColorsColor );
2119)     labelColorsColor.setLabelFor( panelColorsColor );
2120)     labelColorsAlpha = new JLabel( "alpha:" );
2121)     labelColorsAlpha.setVerticalAlignment( JLabel.BOTTOM );
2122)     panelColorsSettings.add( labelColorsAlpha );
2123)     panelColorsAlpha = new JPanel( new FlowLayout( FlowLayout.CENTER, 5, 3 ) );
2124)     panelColorsSettings.add( panelColorsAlpha );
2125)     sliderColorsAlpha = new JSlider( JSlider.HORIZONTAL, 0, 255, 255 );
2126)     size = sliderColorsAlpha.getPreferredSize( );
2127)     size.width = size.width * 2 / 5;
2128)     sliderColorsAlpha.setPreferredSize( size );
2129)     sliderColorsAlpha.setSnapToTicks( true );
2130)     sliderColorsAlpha.addChangeListener( this );
2131)     panelColorsAlpha.add( sliderColorsAlpha );
2132)     textColorsAlpha = new JTextField( "FF", 2 );
2133)     textColorsAlpha.setHorizontalAlignment( JTextField.CENTER );
2134)     textColorsAlpha.addActionListener( this );
2135)     textColorsAlpha.addFocusListener( this );
2136)     panelColorsAlpha.add( textColorsAlpha );
2137)     labelColorsAlpha.setLabelFor( panelColorsAlpha );
2138)     //color panel - color icons
2139)     colorIdx = 0;
2140)     colors = new Color[constColorCnt];
2141)     size = textColorsAlpha.getPreferredSize( );
2142)     iconsColor = new ImageIcon[constColorCnt];
2143)     for( i = 0; i < constColorCnt; i++ )
2144)     {
2145)       iconsColor[i] = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2146)       val = (constColorCnt - 1 - i) * 255 / (constColorCnt - 1);
2147)       colors[i] = new Color( val, val, val );
2148)       iconFromColor( iconsColor[i], colors[i] );
2149)       buttonsColor[i].setIcon( iconsColor[i] );
2150)     }
2151)     iconColorsColor = new ImageIcon( new BufferedImage( size.width, size.height, BufferedImage.TYPE_INT_RGB ) );
2152)     iconFromColor( iconColorsColor, colors[colorIdx] );
2153)     buttonColorsColor.setIcon( iconColorsColor );
2154)     buttonsColor[colorIdx].setSelected( true );
2155)     frameEditor.setColor( colors[colorIdx] );
2156) 
2157)     //create play timer
2158)     timerPlay = new javax.swing.Timer( 100, this );
2159)     timerPlay.setRepeats( false );
2160)     timerPlay.stop( );
2161) 
2162)     //update controls
2163)     updateFrames( 0 );
2164) 
2165)     //running as full application
2166)     if( isFullApp )
2167)     {
2168)       //calculate size for main window, menus and controls
2169)       frame.pack( );
2170)       //show main window
2171)       frame.setVisible( true );
2172)     }
2173)     //running as applet
2174)     else
2175)     {
2176)       //arrange menus and controls
2177)       size = getSize( );
2178)       resize( 1, 1 );
2179)       resize( size );
2180)     }
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

2181) 
2182)     //load initial file
2183)     if( initialFile != null )
2184)     {
2185)       //set current file and current directory
2186)       curFile = (new File( initialFile )).getAbsoluteFile( );
2187)       curDir = curFile.getParentFile( );
2188) 
2189)       //load file
2190)       fileLoad( );
2191)     }
Christian Heimke Blimp v.0.2 (2004-11-10)

Christian Heimke authored 13 years ago

2192)   }
2193) 
2194)   //entry point for applet
2195)   public void init( )
2196)   {
2197)     javax.swing.SwingUtilities.invokeLater( this );
2198)   }
2199) 
2200)   //entry point for full application
2201)   public static void main( String[] args )
2202)   {
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

2203)     int i;
2204)     BlinkenMovie movie;
2205)     Pattern sizePattern, dimPattern;
2206)     Matcher sizeMatcher, dimMatcher;
2207)     String txtOld, txtNew;
2208) 
2209)     //running interactively - without arguments
2210)     if( args.length <= 0 )
2211)     {
2212)       javax.swing.SwingUtilities.invokeLater( new Blimp( null ) );
2213)       return;
2214)     }
2215) 
2216)     //running interactively - load initial file
2217)     if( args.length == 1 && ! args[0].substring( 0, 1 ).equals( "-" ) )
2218)     {
2219)       javax.swing.SwingUtilities.invokeLater( new Blimp( args[0] ) );
2220)       return;
2221)     }
2222) 
2223)     //running as command line tool
2224)     System.out.println( "BlinkenLightsInteractiveMovieProgram\n" +
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

2225)                         "version 1.2.1 date 2006-08-01\n" +
Christian Heimke Blimp v.0.6 (2005-03-10)

Christian Heimke authored 13 years ago

2226)                         "Copyright (C) 2004-2005: Stefan Schuermans <1stein@schuermans.info>\n" +
Christian Heimke Blimp v.0.3 (2004-11-12)

Christian Heimke authored 13 years ago

2227)                         "Copyleft: GNU public license - http://www.gnu.org/copyleft/gpl.html\n" +
2228)                         "a blinkenarea.org project\n" +
2229)                         "powered by eventphone.de\n" );
2230) 
2231)     //initialize patterns
2232)     sizePattern = Pattern.compile( "^([0-9]+)x([0-9]+)-([0-9]+)/([0-9]+)$" );
2233)     dimPattern = Pattern.compile( "^([0-9]+)x([0-9]+)$" );
2234) 
2235)     //get initial movie
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

2236)     movie = new BlinkenMovie( defHeight, defWidth, defChannels, defMaxval );
Christian Heimke Blimp v.1.2.1 (2006-08-01)

Christian Heimke authored 13 years ago

2237)     movie.insertInfo( 0, "creator", "Blimp (version 1.2.1 date 2006-08-01)" );
Christian Heimke Blimp v.0.5 (2004-11-19)

Christian Heimke authored 13 years ago

2238)     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

2239) 
2240)     //process parameters
2241)     for( i = 0; i < args.length; i++ )
2242)     {
2243) 
2244)       if( args[i].equals( "-h" ) || args[i].equals( "--help" ) )
2245)       {
2246)         System.out.println( "interactive movie editor:\n" +
2247)                             "  java Blimp [<initial-file>]\n" +
2248)                             "\n" +
2249)                             "command line tool:\n" +
2250)                             "  java Blimp <parameter> [<parameter> [...]]\n" +
2251)                             "parameters:\n" +
2252)                             "  -i / --input <file>                                  load movie\n" +
2253)                             "  -r / --resize <width>x<height>-<channels>/<colors>   resize movie\n" +
2254)                             "  -s / --scale <width>x<height>                        scale movie\n" +
2255)                             "  -o / --output <file>                                 save movie\n" +
2256)                             "\n" );
2257)       }
2258) 
2259)       else if( args[i].equals( "-i" ) || args[i].equals( "--input" ) )
2260)       {
2261)         if( i + 1 >= args.length )
2262)         {
2263)           System.out.println( "parameter \"-i\" / \"--input\" requires an argument" );
2264)           break;
2265)         }
2266)         i++;
2267)         if( ! movie.load( args[i] ) )
2268)         {
2269)           System.out.println( "movie \"" + args[i] +  "\" could not be loaded..." );
2270)           break;
2271)         }
2272)         System.out.println( "movie \"" + args[i] +  "\" was loaded successfully..." );
2273)       }
2274) 
2275)       else if( args[i].equals( "-r" ) || args[i].equals( "--resize" ) )
2276)       {
2277)         if( i + 1 >= args.length )
2278)         {
2279)           System.out.println( "parameter \"-r\" / \"--resize\" requires an argument" );
2280)           break;
2281)         }
2282)         i++;
2283)         txtOld = movie.getWidth( ) + "x" +
2284)                  movie.getHeight( ) + "-" + 
2285)                  movie.getChannels( ) + "/" + 
2286)                  (movie.getMaxval( ) + 1);
2287)         if( ! (sizeMatcher = sizePattern.matcher( args[i] )).find( ) )
2288)         {
2289)           System.out.println( "invalid format \"" + args[i] + "\"of size (<width>x<height>-<channles>/<colors>)" );
2290)           break;
2291)         }
2292)         movie.resize( Integer.parseInt( sizeMatcher.group( 2 ) ),
2293)                       Integer.parseInt( sizeMatcher.group( 1 ) ),
2294)                       Integer.parseInt( sizeMatcher.group( 3 ) ),
2295)                       Integer.parseInt( sizeMatcher.group( 4 ) ) - 1 );
2296)         txtNew = movie.getWidth( ) + "x" +
2297)                  movie.getHeight( ) + "-" + 
2298)                  movie.getChannels( ) + "/" + 
2299)                  (movie.getMaxval( ) + 1);
2300)         System.out.println( "resized movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
2301)       }
2302) 
2303)       else if( args[i].equals( "-s" ) || args[i].equals( "--scale" ) )
2304)       {
2305)         if( i + 1 >= args.length )
2306)         {
2307)           System.out.println( "parameter \"-s\" / \"--scale\" requires an argument" );
2308)           break;
2309)         }
2310)         i++;
2311)         txtOld = movie.getWidth( ) + "x" +
2312)                  movie.getHeight( );
2313)         if( ! (dimMatcher = dimPattern.matcher( args[i] )).find( ) )
2314)         {
2315)           System.out.println( "invalid format \"" + args[i] + "\" of dimension (<width>x<height>)" );
2316)           break;
2317)         }
2318)         movie.scale( Integer.parseInt( dimMatcher.group( 2 ) ),
2319)                      Integer.parseInt( dimMatcher.group( 1 ) ) );
2320)         txtNew = movie.getWidth( ) + "x" +
2321)                  movie.getHeight( );
2322)         System.out.println( "scaled movie from \"" + txtOld + "\" to \"" + txtNew + "\"..." );
2323)       }
2324) 
2325)       else if( args[i].equals( "-o" ) || args[i].equals( "--output" ) )
2326)       {
2327)         if( i + 1 >= args.length )
2328)         {
2329)           System.out.println( "parameter \"-o\" / \"--output\" requires an argument" );
2330)           break;
2331)         }
2332)         i++;
2333)         if( ! movie.save( args[i] ) )
2334)         {
2335)           System.out.println( "movie \"" + args[i] +  "\" could not be saved..." );
2336)           break;
2337)         }
2338)         System.out.println( "movie \"" + args[i] +  "\" was saved successfully..." );
2339)       }
2340) 
2341)       else
2342)         System.out.println( "unknown parameter \"" + args[i] + "\" - use \"-h\" or \"--help\" to get help" );
2343) 
2344)     } //for( i...