Sat Jan 24 18:00:55 EST 2004 Released JChirp 0.0 2004-01-24 C. Scott Ananian * lib/jutil.jar, src/swing/CCTable.java, configure.ac: Updated to Jutil 1.1 and JSR-14 compiler version 2.4a1. 2003-04-26 C. Scott Ananian * Makefile.am: Add 'doc' to the list of .PHONY targets. * src/GUI/Version.java.in: Keep bug-report email address out of the docs (and hence off the 'net). * src/GUI/Version.java.in: Added javadoc to the 'Version' class. * src/swing/AncestorAdapter.java, src/GUI/JTimeLabel.java: AncestorAdapter class was in wrong package (GUI instead of swing). Fixed. * .cvsignore, Makefile.am: Make 'doc' rule work correctly. Add 'doc' and 'doc-link' directories to .cvsignore. Add 'Implementation-Version' tag to generated .jar file. Add 'upload' rule to Makefile.am. 2003-04-04 C. Scott Ananian * src/GUI/LAFDialog.java: Workaround JDK brokenness; allow selection of GTK LAF in JDK1.4.2beta. 2003-03-20 C. Scott Ananian * lib/jutil.jar: Update JUtil version. * lib/README, lib/jutil.jar, src/Makefile.am, src/swing/CCTable.java, src/swing/Makefile.am, Makefile.am, configure.ac: Remove src/util directory: these classes are now in the separate JUtil package. Add jutil.jar to the lib/ directory and use it to compile the com.chirpcheap.jchirp.swing package (CCTable uses it). Also fix a bug in javadoc generation (the com.chirpcheap.jchirp package was being omitted) and some harmless but needless cruft in the ChangeLog makefile rule. 2003-03-17 C. Scott Ananian * src/GUI/MainWindow.java, TODO: Add cut/copy/paste/clear functionality. The menu entries work, but the toolbar buttons don't because they get focus before the action is invoked, causing the action to 'forget' where it was supposed to be cutting/etc from/to. Several possible solutions: perhaps the toolbar buttons can get *temporary* focus? Alternatively, remember 'last' valid focused component, and apply to that. (But what if valid component is now on another tabbed page? That would be very unintuitive.) * src/GUI/JStatusBar.java, src/GUI/MainWindow.java: Make the status bar display useful information when we mouse over or keyboard-focus-through components (currently only AbstractButtons). * src/Main.java: Ask swing to turn on auditory feedback in the GUI. * src/GUI/JCueTable.java: Set 'surrendersFocusOnKeystroke' to true for JCueTable. JFormattedTextFields do not maintain selection well. It does not seem to be possible to get the contents of the field to be selected when focus is transferred, because focus gained/lost produces other side effect in the cell (re-formatting?) which seem to reset the selection. =( * src/GUI/JPatchTable.java: Some keyboard-navigation improvements to JPatchTable. Not terribly pleased with them, yet. Although I can get the field to select itself when it gets focus, the JTable's implementation gives focus *after* it passes a keypress-to-start-editing to the field. So a simple keypress is appended to the selection, instead of replacing the contents of the field. To fix this, I have to turn off the 'autoStartsEdit' property of the JTable. I also have to ask the JTable to surrender focus on keystroke so that the cell gets the focus to begin with. Finally, even with editor.setClickCountToStart(0), tabbing through the cells makes clicking to start editing very unpredictable. What is really wanted, of course, is for 'enter' in a cell to commit the current cell, and *if correct* to jump down to the next dimmer, with the cell's contents already selected for you to easily replace. You shouldn't really be able to select non-editable cells in this table. * src/GUI/CueComboBox.java, src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/JStageComponent.java, src/GUI/MainWindow.java, src/GUI/PropertiesDialog.java: Enable drag & drop support for most editable components (spinners don't yet support it). 2003-03-14 C. Scott Ananian * src/GUI/JStageComponent.java: Split the buttonBar into multiple panels for better resize behavior (GridBagLayout gets very cranky when it is not given as much space as it wants). * TODO: Update TODO list. * src/GUI/JPatchTable.java: Allow range specifications in IntSetDocument. * src/GUI/MainWindow.java: Add functional 'Change Theme...' entry to the 'View' menu, using the LAFDialog. * src/GUI/LAFDialog.java: Fix some bugs and make sure LAFDialog always appears with the selected theme, even if the user uses the Cancel button. Also use Window.getOwnedWindows() to apply new theme to dialogs as well as frames. Further, define a marker interface 'Unpackable'. Unless this marker is present, windows will be repacked when the theme changes (which is usually the right thing to do). NOTE that we should also probably define a theme-change-listener, as our size-adaptive CCTables really need to be resized when the theme changes, as well. * src/GUI/Icons.java, src/GUI/Lock16.gif, src/GUI/Lock16.png, src/GUI/Lock24.gif, src/GUI/Lock24.png, src/GUI/Makefile.am, src/GUI/Unlock16.gif, src/GUI/Unlock16.png, src/GUI/Unlock24.gif, src/GUI/Unlock24.png, src/GUI/gnome-ccthemes-16.png, src/GUI/gnome-ccthemes-2.png, src/GUI/gnome-ccthemes-24.png, src/GUI/gnome-ccthemes-48.png, src/GUI/gnome-ccthemes-lav-16.png, src/GUI/gnome-ccthemes-lav-24.png, src/GUI/gnome-ccthemes-lav-48.png, src/GUI/gnome-ccthemes.png: Converted all Icons to PNG (some were gif) and renamed gnome-ccthemes variants to conform to standard size-suffix naming convention. 2003-03-13 C. Scott Ananian * src/GUI/Icons.java, src/GUI/MainWindow.java, src/GUI/Makefile.am, src/GUI/gnome-ccthemes-2.png: Use drama masks icon (borrowed from GNOME) for the Main Window icon and in the about box. * src/GUI/Makefile.am, src/GUI/gnome-ccthemes.png: Add icon from GNOME which could make a good application icon for JChirp. * src/GUI/LAFDialog.java, src/GUI/Makefile.am: Add a dialog to choose a Look-And-Feel for the program. * src/GUI/JMasterSlider.java, src/GUI/JStageComponent.java, src/GUI/Makefile.am: Add a 'master' slider to the right-hand side of the Stage view. Currently non-functional. * src/GUI/JStageComponent.java, src/Main.java: Make a Channel/Dimmer combo box on the JStageComponent toolbar so that we can look at a dimmer view of the stage. * src/GUI/JCueTable.java, src/GUI/OKDialog.java, src/GUI/PropertiesDialog.java: Consolidated a lot of code in PropertesDialog and JCueTable.MyDialog by making these subclass OKDialog. * src/GUI/JumpDialog.java, src/GUI/MainWindow.java, src/GUI/Makefile.am, src/GUI/OKDialog.java: Add 'jump to cue' dialog, based on glade prototyping. I moved the standard dialog stuff off into an 'OKDialog' superclass. There seems to be some weird interaction between a RootPane's 'default button' and CueComboBox. * src/swing/ListFormat.java, src/swing/Makefile.am: Add ListFormat class, which formats and parses a (possibly-sorted) list of things formatted by another instanceof Format. * src/Model/Cue.java, src/GUI/JStatusBar.java: JStatusBar now displays the total time for the cue, including any delay. Updated Cue to make it clearer what the delay time actually is. JStatusBar factors in the cue progress as well, so that the time counts down as the cue progresses. 2003-03-12 C. Scott Ananian * src/GUI/JCueTable.java, src/Model/CueTime.java: Extend CueTime with methods to make it a full (albeit abstract) numeric type: you can now compare, add, subtract, and scale cue times. The 'isZero()' method was removed in favor of a singleton ZERO instance you can compare to. JCueTable was the only user of isZero(); it's been changed to use CueTime.equals(CueTime.ZERO) instead. * src/GUI/MainWindow.java: Add functioning 'Revert' entry to file menu. * src/GUI/JStatusBar.java: Add functioning CueComboBox to the 'next cue' indicator. * src/GUI/CueComboBox.java: Add an extra parameter to specify whether we should accept cues not present in the show or not. * src/Model/RunState.java: Allow setting currentCue/nextCue to null. Setting nextCue to null resets the 'default follow' behavior; setting currentCue to null clears the stage. * src/GUI/CueComboBox.java, src/GUI/Makefile.am: Implement a ComboBox for selecting cues in a show. Registers proper listeners so it's cue list stays in sync with the Model. * src/swing/AbstractComboBoxEditor.java, src/swing/CCComboBox.java, src/swing/FormattedComboBoxEditor.java, src/swing/Makefile.am: Add a FormattedComboBoxEditor to make it easier to use a CCFormattedTextField with a JComboBox. Added CCComboBox subclass of JComboBox to work around a bug with updating the editor when the selection in the combo box is programmatically changed. Added abstract AbstractComboBoxEditor to make it easier to create additional ComboBoxEditor implementations in the future. * src/GUI/JStatusBar.java: Use an icon for dirty/not-dirty status. * src/GUI/MainWindow.java: Rearrange toolbar and button labels. * src/GUI/Icons.java: Rearrange icon definitions to avoid forward references. Add icons for dirty/not-dirty. * src/GUI/JStatusBar.java: Restructure JStatusBar for better look and cleaner code. Now matches the look of the GChirp prototype better. * src/GUI/Icons.java, src/GUI/JStageComponent.java, src/Main.java: Added bottom 'captured channels' button bar to JStageComponent. Required adding an Icon to the Icons class and resizing the default window size in Main.java. * src/GUI/PropertiesDialog.java: Clean up properties dialog by using JSeparators instead of just insets. * src/swing/EqualHeightLayout.java, src/swing/LayoutDelegate.java, src/swing/Makefile.am, src/GUI/Icons.java, src/GUI/JCueTable.java, src/GUI/JStatusBar.java, src/GUI/PropertiesDialog.java, lib/gtk-icons.jar: Icon and spiffiness work. Re-spun gtk-icons.jar with smaller/larger versions of some icons (so we don't have to rescale the image in software), and added OK/RESET/CANCEL icons to Icons.java. Changed JCueTable and PropertiesDialog to use these icons on their custom dialogs. Also added new EqualHeightLayout which is similar to a horizontal box layout, except that it expands all of the components so that they are the same height. Use this to layout the buttons in JCueTable and PropertiesDialog, as well as to tidy up the JStatusBar. * src/GUI/Icons.java, src/GUI/JStatusBar.java, src/GUI/MainWindow.java, src/GUI/Makefile.am: Added new Icons class to collect Icon definitions in one place. Added code to switch everything over to using large GTK icons with no button text. * lib/README, lib/gtk-icons.jar, Makefile.am: Add gtk+2.0 stock icons to lib as gtk-icons.jar. This should improve our look dramatically. 2003-03-08 C. Scott Ananian * TODO: More to-do items after fooling around with glade. * src/swing/Makefile.am, src/swing/SpinnerCellEditor.java: Add a TableCellEditor implementation that uses a JSpinner. There are some problems with using JSpinners in tables, however: 1) the first click in the table cell may hit the spinner buttons, causing the value to change immediately. 2) a spinner requires significantly more space (both height and width) than the JLabel used as the CellRenderer. Somehow we have to communicate this height requirement to the JTable. For these reasons, I'm not switching JCueTable over to using spinners for its level entries yet. * src/GUI/PropertiesDialog.java: Change Number of dimmer/number of channels entries from text fields to spinners. 2003-03-07 C. Scott Ananian * src/GUI/MainWindow.java: Hook up table row insert/delete actions to methods in JCueTable. Not quite right yet: the buttons should be disabled when there is nothing selected in the JCueTable, but that's not done yet. [Also, the 'tabbed view selection' model should probably be factored out so that unrelated code can more easily question what the view is, without seeing the details of the tabbed pane/radio buttons/etc.] * src/GUI/JCueTable.java: Add interface for inserting near/deleting selected cues. Right now only the 'deleteSelectedCues()' method is implemented. * TODO: More things to do. * src/swing/CCTable.java: Bug-fix: forgot that indexes to rowEntries are off by one to accomodate the '-1' header row. 2003-03-06 C. Scott Ananian * Makefile.am, TODO: Add TODO file documenting what still needs to be done. * src/swing/CCTable.java: Add auto-resizing of columns to accomodate cell width changes to CCTable. Unfortunately, after seeing how this works, I'm not certain it's a good technique from the UI standpoint. Perhaps fixed sizes are best: it's distracting to have columns change size on you; it's better that they have enough space to begin with. The solution is probably to expose the mechanism in CCTable and allow the user to specify what should be done on a column-by-column basis. * src/swing/CCTable.java: Use a heap to make the column preferred widths the same as the maximum cell width. We don't listen to update events, yet, so we don't update the preferred widths when the model contents change. * src/GUI/PropertiesDialog.java: Update the application defaults for the number of dimmers & channels when the user changes these values in a show's property dialog (on the assumption that these values are likely to be used again for other shows). * src/swing/CCTable.java: First-draft implementation of TableColumn subclass: table columns are sized according to header. Next version will use a heap to size the table column according to the largest cell or header contents. * src/swing/CCTable.java: Tweaked tableChanged() implementation to defer event handling when necessary to allow a cursor update to complete *or* to ensure correct ordering of events. Also changed the update message from remove/insert to a simple row interval update; this allows us to avoid updating, for example, the very last row of the array in every case. Removed column selection munging, since column selection should remain unchanged. Added code to update selection anchor point and lead, which makes things behave better. Refactored the code a bit to remove newly-unnecessary generality & such not. 2003-03-05 C. Scott Ananian * src/swing/CCTable.java: Try to fix up selection after row move. Unforunately, the UI implementation for a 'tab' focus event gets the anchor position, *then* calls stopCellEditing() (which eventually calls tableChanged()), *then* updates the anchor with the (now out-of-date) anchor position, clobbering the selection fix we'd attempted. I'm going to try to fix this by delaying the selection update, in the next commit. We should also make sure the resulting anchor and lead positions are correct. * src/GUI/JCueTable.java: Don't allow renumbering a cue to a pre-existing cue number. * src/GUI/MainWindow.java: Hook up go/back/halt buttons and enable/disable them where appropriate. * src/GUI/JStatusBar.java: Fix a buglet in JStatusBar that may confuse things when currentCue and nextCue point to the same cue object. * src/Model/RunState.java: Make the 'nextCue' field an object, not an index. This way we can track renumberings of currentCue which cause the nextCue to change. When nextCue is 'null' the next cue is "implicit" -- it's the cue after currentCue, if that exists. Otherwise the nextCue has been explicitly set and doesn't change even when the currentCue changes. Register a CueListener on currentCue so that we can fire the FaderChanged message when a renumbering of currentCue causes the nextCue to change. Added rough implementations of RunState.go()/halt()/back(). None of these implementations deal with halted, looped, or premature cues yet. (perhaps getNextCue() should handle looped cues, so that 'go' doesn't have to?) * src/Model/Show.java: Add Show.getCueBefore(CueNumber) and Show.getCueAfter(CueNumber) accessors. * src/Model/Cue.java: Add 'toString()' and 'equals()' methods to Cue class. * src/swing/.cvsignore, src/swing/AncestorAdapter.java, src/swing/CCAbstractTableModel.java, src/swing/CCFormattedTextField.java, src/swing/CCTable.java, src/swing/CCTableModelEvent.java, src/swing/CommitListener.java, src/swing/FormattedCellEditor.java, src/swing/Makefile.am, src/GUI/AncestorAdapter.java, src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/Makefile.am, src/GUI/MyDefaultCellEditor.java, src/GUI/MyFormattedTextField.java, src/GUI/MyJTable.java, src/GUI/PropertiesDialog.java, src/Makefile.am, configure.ac: Moved generic swing extensions to com.chirpcheap.jchirp.swing package. Renamed to eliminate the bogus 'My' prefix. Created new CCAbstractTableModel class that provides better support for firing CCTableModelEvents. * src/Model/Show.java, src/GUI/JCueTable.java, src/GUI/MyJTable.java: Added showCueRenumbered() to Show.Listener, and extended the CueListChangeEvent to add the extra information needed to support this. A corresponding 'fireShowCueRenumbered' method goes in the Show object, and Show.renumberCue is modified to use this, instead of separately calling fireShowCueRemoved() and fireShowCueAdded(). An ExtendedTableModelEvent class was added to MyJTable, with a new type of MOVE to indicate that table rows are moving. The implementation of tableChanged() was tweaked so that a MOVE event looks like a row remove/insert to the underlying code. We should add code to maintain the selection and position properly here, too. Changed the implementation of the Show.Listener in JCueTable to fire the table row moved event when it received a showCueRenumbered() message. Implemented fireTableRowsMoved() here but it really should go in an ExtendedAbstractTableModel superclass. 2003-03-04 C. Scott Ananian * src/GUI/JCueTable.java: Update obsolete 'fixme' comment. * src/Model/CueNumber.java, src/GUI/JCueTable.java: Add a new variant of CueNumber.format() that allows zero-length strings to be successfully parsed as the 'null' CueNumber. Update JCueTable to use this variant to allow removing cue links. 2003-03-03 C. Scott Ananian * src/GUI/JCueTable.java: Bug fix: hide dialog when editing stopped or cancelled. Also trigger cancel when getTableCellEditorComponent is called, as the API says we ought. Improvements: make cue down time track up time where appropriate, and have cue link times follow cue up/down times. * src/GUI/JCueTable.java, src/GUI/MainWindow.java: Ergh, workaround dialog positioning bug: Window.setLocationRelativeTo() doesn't seem to work correctly until *after* dialog.setVisible(true) -- which looks awful, but at least this way it works. * src/GUI/JCueTable.java: Allow edits to the aggregate Time and Link fields in the cue table. A few bugs still: TimeAggregates don't sync up and down times, LinkAggregate doesn't let you remove a link, and the dialog that pops up is misplaced every time but the first. * src/Model/Cue.java: 'null' is a valid value for Cue.linkNumber. * src/Model/Cue.java: Time aggregate and Link aggregate formatting is in the domain of the UI, not the model. * src/Model/CueTime.java: CueTime objects are immutable. * src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/Makefile.am, src/GUI/MyJTable.java: Add our own JTable subclass which will be more intelligent with row reorderings and column sizing. At the moment, though, it behaves identically to JTable. Use this new subclass in JCueTable and JPatchTable. * src/GUI/Makefile.am: Forgot to add the icon files to EXTRA_DIST. * src/GUI/JStatusBar.java: Remove a fixme comment which is no longer applicable. * src/GUI/JStatusBar.java, src/GUI/Lock16.gif, src/GUI/Lock24.gif, src/GUI/Makefile.am, src/GUI/Unlock16.gif, src/GUI/Unlock24.gif, Makefile.am: Add lock/unlock icons to src/GUI, and the makefile rules to support them. Add lock icon to status bar indicating whether the show is editable or not. Add tool tip text to 'dirty' indicator. * src/GUI/MainWindow.java: Make MainWindow.stdIcon() static so it can be used by other classes. * src/GUI/JCueTable.java: Change selection mode in JCueTable. * src/Model/Show.java: Add an efficient implementation of indexOf() to the CueNumberList; use this instead of calls to binarySearch where appropriate. Add lots of method/field documentation to the Show class. Made constructors, setDirty() method non-public. * src/Model/RunState.java: Make RunState constructors non-public; also make listenerList final. * src/Model/Application.java: Make the listenerList final. * src/GUI/DecimalField.java, src/GUI/FormattedDocument.java, src/GUI/Makefile.am, src/GUI/WholeNumberField.java: Remove unused classes DecimalField, FormattedDocument, and WholeNumberField. We use JFormattedTextField and instances of java.text.Format instead. * src/GUI/Makefile.am, src/GUI/JCueTable.java, src/GUI/MyDefaultCellEditor.java: Write a wrapper around DefaultCellEditor that knows how to properly deal with JFormattedTextFields. Update JCueTable to use it, instead of its own home-spun version. 2003-03-02 C. Scott Ananian * src/GUI/JCueTable.java, src/Model/Cue.java, src/Model/Show.java: Made Cue.setCueNumber() package-scope and added a new public method to Show: renumberCue(oldCueNumber, newCueNumber). This way users of the model can't make the model inconsistent; the Show method takes care of ensuring the renumbered cue ends up in the right location in the cue list. 2003-03-01 C. Scott Ananian * src/GUI/JCueTable.java: Fix weird editing behavior when tabbing out of cells. DefaultCellEditor doesn't really know how to handle JFormattedTextFields. 2003-02-28 C. Scott Ananian * src/GUI/JCueTable.java: Generate TableCellUpdated events on receipt of Show.CueListChangeEvents. * src/Model/Show.java: Remember to add cueChangeListener to new cues added/remove it from cues which are removed. * src/Model/Show.java: Implement Show Cue listener interface. addCue/removeCue and modifications of a Cue object now fire the appropriate events (and make the show dirty). Documented the Listener/Adapter/Event interfaces, too. * src/Model/Show.java: Write cue add/remove methods. Also allow fetching cues by CueNumber. New isValid() method for asserting Show object consistency. * src/Model/Cue.java: Make the Cue constructors non-public, since you should use the addCue() method in the Show model instead of directly instantiating Cue. * src/Model/Patch.java: Add some assertions to check consistency. * src/Model/CueNumber.java: Make CueNumber objects Comparable. * src/GUI/JPatchTable.java: Added 'unassigned' row where channels with no dimmers (or vice-versa) show up. Also fixed the default cell renderer so that all cell contents are centered. * src/GUI/JCueTable.java: Allow some editing in the cue table, although the FormattedTextField is not playing nicely with the table. * src/GUI/JStatusBar.java, src/Model/Cue.java: Add mutators to Cue in model; also subclassed ChangeEvent to provide a better description of what in the Cue is changing. Still uncertain: how changing CueNumber affects the cue order in the Show, and how changing the number of channels in the show affects the size of the 'levels' array in the Cue. Should we lazily update the array size? But we don't want deleted channels to come back when we add new channels. So we can't be so lazy. Also updated JStatusBar, which was the only instance of Cue.Listener, to account for the new method signatures. * src/GUI/MainWindow.java: Improve 'save' confirmation dialog wording. * src/GUI/PropertiesDialog.java: Remove a fixme comment that has already been addressed. * src/GUI/PropertiesDialog.java: Simpler heuristic for reset button en/disable; also more intuitive (to me, at least). Also add short-cuts to set/reset that avoid triggering unnecessary change events. Combination fixes our speed problems. * src/GUI/PropertiesDialog.java: Have the enabled status of the 'reset' button reflect whether or not there is anything to reset. Unfortunately, this implementation is rather slow. * src/GUI/Makefile.am, src/GUI/MyFormattedTextField.java: Added a subclass of JFormattedTextField that allows us to register a 'commitListener' to receive a callback whenever the text field's value changes. * src/GUI/PropertiesDialog.java: Disable fields in PropertiesDialog when show is not editable. * src/Model/CueTime.java: Disallow negative values in the minutes and seconds fields of CueTime. * src/Model/CueNumber.java, src/Model/CueTime.java: Tweak to CueTime Format class so that decimal point in seconds field is locale-correct. Rewrote CueNumber toString()/valueOf() methods to use a Format class, which is a thin wrapper around DecimalFormat. 2003-02-27 C. Scott Ananian * src/GUI/JPatchTable.java: Added a note about missing a 'no channel'/'no dimmer' row where unassigned dimmers/channels show up. * src/GUI/JCueTable.java: Forgot to register a listener on the patch so that the number of columns is updated when the number of channels changes. * src/GUI/PropertiesDialog.java: Add confirmation dialogs when number of channels/dimmers is changed or when the patch is reset. Added notes to top of file about unimplemented functionality: 'reset' button should track its applicability, and we should not allow changes to the dialog when the 'editable' checkbox is cleared. * src/GUI/PropertiesDialog.java: Update PropertiesDialog to use appropriate instances of JFormattedTextField. Also fix buglet where resetPatch() wasn't being called when the patch changed. * src/Model/Application.java: Restructure Application.getDefaultTime() to deal with the ParseException now possibly thrown by CueTime.valueOf(). * src/Model/CueTime.java: Reimplement CueTime.valueOf() and CueTime.toString() using a Format class extending java.text.Format. This allows us to use this Format class as a parameter to the JFormattedTextField() GUI object constructor as well. * src/GUI/MinMaxIntegerFormat.java: Bug fix: super.parse() can return null if the source can't be parsed at all. We shouldn't throw a NullPointerException in this case. * src/GUI/PropertiesDialog.java: Flesh out properties dialog. Doesn't work yet because we don't have a JFormattedTextField which can deal with CueTime objects. * src/Model/Patch.java: Fix typo in comment. * src/GUI/JCueTable.java: Add 'link' column to JCueTable. * src/GUI/JStatusBar.java: Display the up-time of the next cue. Perhaps that's not the information we want to display? * src/Model/Cue.java: Add accessors for link number and time; tweak cue time stringification. * src/Model/CueTime.java: Fix bug in CueTime.toString() if the number of seconds is less than 10 but the number of minutes is greater than zero; also add option to select a less concise stringification format. * src/Model/RunState.java: Fix bug in RunState constructor; previousCue and progress fields are now initialized correctly. * src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/JStatusBar.java: Update GUI to handle Show.isEditable field. * src/Model/Cue.java: Made fields of Cue private to force others to use the getters. Use show.getDefaultTime() instead of accessing the field directly. * src/Model/Show.java: Add accessors/listener callback for 'Show.isEditable' field. Also the 'show.defaultTime' field was missing get/set methods. Made fields of show private to force others (even within the model) to use the getters. * src/GUI/JCueTable.java, src/GUI/MainWindow.java: Rough implementation of JCueTable to display cue data. Not editable yet. * src/Model/Cue.java: Add Cue.getLevel() accessor. Still need to deal with resizing levels array when the number of channels in the patch changes. * src/Model/RunState.java: Use cue.getNumCues() / show.getCue() instead of accessing the 'cue' list directly. * src/Model/Show.java: Hack in some demo cue information into a 'new' show. Add 'getNumCues()' and 'getCue' accessors to show object. Missing: addCue()/removeCue(). (Mutate happens through Cue object directly.) 2003-02-26 C. Scott Ananian * src/GUI/JStatusBar.java: Add comment about flashing the status bar to indicate battery low/silent beep. * src/GUI/MainWindow.java: Whoops -- misplaced close-brace. *Really* remove the 'application preferences' menu item, since we don't have any application preferences yet. ('Silent mode' might eventually be a pref, though.) * src/GUI/DelegatedNumberFormat.java, src/GUI/Makefile.am, src/GUI/MinMaxIntegerFormat.java: Add 'DelegatedNumberFormat' to make it easier to constrain valid numbers in association with a JTextField using a FormattedDocument. Also added 'MinMaxIntegerFormat' as an example of this. * src/GUI/FormattedDocument.java: Add some notes about FormattedDocument bugs. Will fix later. * src/Model/Application.java: Add new 'silent' application preference; also add a 'Chirp' field, commented out for now. 2003-02-25 C. Scott Ananian * src/GUI/MainWindow.java, src/GUI/Makefile.am, src/GUI/PropertiesDialog.java: Add skeleton of PropertiesDialog for editing show properties. Currently the dialog does not actually do anything, and there are some UI issues to work out. * src/Main.java: Swing has a way to draw window decorations itself. We're not going to use it, at the moment. Maybe later we'll change our mind -- or maybe not. * src/GUI/MainWindow.java, src/Main.java: Put current show file name in the window title. * src/Main.java: Allow a filename on the command-line; open that file at startup if given. Note that we have to use the 'invokeLater' method to allow the action to perform GUI work (error dialogs and such). * src/GUI/MainWindow.java: Make all 'Action' fields final. The 'fixExtension' method no longer tries to add an extension to files which already have one. The 'openAction' has been changed to accept a filename as the actionCommand, in which case it won't open the file dialog. The JMenuItem for 'Open' has to explicitly set the action command to "" for this to work, since menu items have their default action command set to the name of the menu entry. Omit the 'settings' menu in the menu bar, since there aren't any user-visible applications preferences yet. * src/GUI/MainWindow.java: Changes to let the MainWindow's JFileChooser track the Application's "last show directory" preference. * src/Model/Application.java: add 'last show directory' preference to Application model. This lets the file dialog remember where the show files are across executions. * src/Model/Application.java: Canonical application preference information storage is in Preferences node, not in a field of the Application model object. This allows a large crapectomy, simplifying the Application class greatly. * src/Model/Show.java: Add 'isEditable' field to Show model. Use Application field accessor methods, instead of referencing fields directly. * Makefile.am: Add 'backup' rule to top-level makefile. * src/Model/Makefile.am, src/GUI/Makefile.am, src/Makefile.am, configure.ac: Allow use of earlier versions of the GJ compiler; add '-g' debugging flag to AM_JAVACFLAGS. * Makefile.am: Enable assertions in 'make run'. * src/Model/Cue.java: Update Cue model to reflect the fact that Patch no longer has a numChannels field. * src/GUI/MainWindow.java: Update MainWindow: JStatusBar constructor now takes a model parameter. * src/GUI/JStatusBar.java: Add 'dirty' label to JStatusBar. Write listeners and an update() method to hook the JStatusBar up to the model. * src/Model/RunState.java: Add a few accessors to the RunState model, so that we can fetch the current/next Cue object, and get the cue progress. Basically the information needed to implement the status bar GUI. * src/Model/Show.java: Update the Show's Patch.Listener with the new signatures for patchChannelChanged()/patchDimmerChanged() (parameters are now ChannelChangeEvent/DimmerChangeEvent respectively). * src/GUI/JPatchTable.java: Update to reflect List->Set change in Patch model. Add a Patch.Listener to watch patch events and update GUI. Clean up setValueAt() method so that changes are only made to the model if the edited value differs from the original value. This helps keep the dirty flag from being set unnecessarily. * src/Model/Patch.java: Change external interface from channel lists and dimmer lists to channel and dimmer *sets*. This is actually the correct semantics; the order of the items in the channel/dimmer assignments doesn't matter. The internal data structure is still a list for memory-efficiency reasons. Eventually I'll implement a proper ArraySet or VectorSet or some such to remedy this. (Provide set semantics with memory efficiency of vector; search/add efficiency will decrease as set size increases, but that's okay because set sizes are expected to be very small.) Add a not to setNumChannels() about possibly needing a cue list update? Add DimmerChangeEvent and ChannelChangeEvent so that the patchChannelChanged() and patchDimmerChanged() listener methods can be more specific. 2003-02-22 C. Scott Ananian * src/Model/Show.java: Add self-listeners to Show object to maintain 'dirty' status when cues or show meta-information changes. Add a listener to the patch object to maintain show 'dirty' status when patch changes. * src/Model/Patch.java: Properly implement Patch.getDimmersForChannel() and Patch.getChannelsForDimmer() so that list mutations are allowed and maintain consistency between channel and dimmer view and properly notify listeners of changes. * src/GUI/JPatchTable.java: Always display patch assignments in sorted order. * src/Model/Patch.java: Reworked Patch representation: we now have two parallel maps, from dimmers to channels and vice-versa. We don't need to 'numChannels' and 'numDimmers' fields because they are represented by the size of the maps. Now all we have to do is make the channel/dimmer assignment lists properly mutable! * Makefile.am: Add non-functional javadoc rule. Eventually Sun will see fit to support GJ in the javadoc tool. * src/Makefile.am, configure.ac: Added the Util package from FLEX to get us MultiMaps and all sorts of similar goodness. 2003-02-21 C. Scott Ananian * src/GUI/MainWindow.java: Add a listener so that the enabled status of the save button tracks the dirty status of the model. Also better handle file-not-found on open. * src/Model/Cue.java, src/Model/CueNumber.java, src/Model/CueTime.java, src/Model/Patch.java, src/Model/Show.java: Make Model objects Serializable so that we can implement openShow and saveShow. * src/Model/Application.java, src/Model/Cue.java, src/Model/Patch.java, src/Model/RunState.java, src/Model/Show.java: Added Listener interfaces & callbacks to the Model. * src/Model/CueNumber.java, src/Model/CueTime.java: Implemented hashCode() method. * src/Model/CueNumber.java, src/Model/CueTime.java: Implemented appropriate equals() methods. * src/Model/Application.java, src/Model/Cue.java, src/Model/CueNumber.java, src/Model/CueTime.java, src/Model/Makefile.am, src/Model/Show.java, src/Model/Time.java: Add CueTime and CueNumber classes to encapsulate storage/display of these values. Added Application.Listener and hooked everything in Application up to it. Also added a PreferenceChangeListener to Application constructor so that the application will keep up with external changes to the preferences values. * src/Model/Application.java, src/Model/Show.java, src/GUI/MainWindow.java: Filter file open/save as dialog to only display .shw files. Better handle File I/O errors on load/save. * src/Model/Application.java, src/Model/Show.java, src/GUI/MainWindow.java: Add GUI for File->New/Open/Save/Save As/Exit and Help->About. Model changes to support File operations, although actual File I/O is not yet implemented. 2003-02-20 C. Scott Ananian * src/GUI/JPatchTable.java: Finish JPatchTable implementation: now lets you reorder columns and the display updates appropriately. Has custom editor for the dimmer/channel lists that tries hard to keep the contents of the text field valid. Modifies the model when the table is modified --- at the moment changes to the model through an OperationUnsupportedException, but that's the fault of the Model, not this component. * src/GUI/JPatchTable.java: Make a note about redundant change notifications. * src/GUI/JPatchTable.java, src/GUI/MainWindow.java: Started extending JPatchTable so that it actually displays data from the model. * src/GUI/FormattedDocument.java, src/GUI/Makefile.am: Forgot to add FormattedDocument class, which is needed by DecimalField. * src/Model/Application.java, src/Model/Patch.java, src/Model/RunState.java, src/Model/Show.java: Make model usable from outside the package by adding some accessor methods and making a few fields public final. * src/GUI/DecimalField.java, src/GUI/Makefile.am: Added DecimalField from the Javasoft Swing tutorial. * src/GUI/Makefile.am, src/GUI/WholeNumberField.java: Added WholeNumberField from the Javasoft Swing demo. * src/GUI/AncestorAdapter.java, src/GUI/JTimeLabel.java, src/GUI/Makefile.am: Added AncestorListener to JTimeLabel to appropriately create/destroy the timer associated with the component. * Makefile.am: Add 'make run' target. * Makefile.am: Tweaked JAR file manifest to include the look-and-feel library in the classpath. * src/GUI/Version.java.in, classes/.cvsignore, AUTHORS, JarRules.make, JavaRules.make, Makefile.am, configure.ac: Remove unnecessary JarRules.make and JavaRules.make files. Fix some buglets in the autotools-izing. * src/Model/.cvsignore, src/Model/Makefile.am, src/GUI/.cvsignore, src/GUI/MainWindow.java, src/GUI/Makefile.am, src/GUI/Version.java.in, src/.cvsignore, src/Makefile.am, src/Version.java, src/Version.java.in, scripts/README, lib/README, classes/README, .cvsignore, JarRules.make, JavaRules.make, Makefile.am, NEWS, README, autogen.sh, configure.ac: autoconf/automake-ize the jchirp project. * Makefile: Removing old Makefile in preparation for autoconf'ing the package. * src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/JStageComponent.java, src/GUI/JStatusBar.java, src/GUI/JTimeLabel.java, src/GUI/MainWindow.java, src/Main.java, src/Model/Application.java, src/Model/Cue.java, src/Model/Patch.java, src/Model/RunState.java, src/Model/Show.java, src/Model/Time.java, src/Version.java, src/Version.java.in: Imported sources * src/GUI/JCueTable.java, src/GUI/JPatchTable.java, src/GUI/JStageComponent.java, src/GUI/JStatusBar.java, src/GUI/JTimeLabel.java, src/GUI/MainWindow.java, src/Main.java, src/Model/Application.java, src/Model/Cue.java, src/Model/Patch.java, src/Model/RunState.java, src/Model/Show.java, src/Model/Time.java, src/Version.java, src/Version.java.in: New file. * Makefile, lib/jlfgr-1_0.jar: Imported sources * Makefile, lib/jlfgr-1_0.jar: New file.