From 160cf7efba8115638352c93af4b37365c5ec4b03 Mon Sep 17 00:00:00 2001 From: mdb Date: Mon, 26 Jan 2004 16:10:55 +0000 Subject: [PATCH] Restructured the UI a bit, prettied things up some, switched out various icons with some others that I dug up from Jimmac's icon page. git-svn-id: https://samskivert.googlecode.com/svn/trunk@1380 6335cc39-0255-0410-8fd6-9bcaacd3b74c --- .../src/java/robodj/chooser/BrowsePanel.java | 52 +++++++---- .../robodj/chooser/CategoryEntryList.java | 15 ++- .../src/java/robodj/chooser/Chooser.java | 13 ++- .../src/java/robodj/chooser/ChooserFrame.java | 22 ++++- .../java/robodj/chooser/EntryController.java | 7 +- .../src/java/robodj/chooser/EntryList.java | 86 ++++++++---------- .../java/robodj/chooser/PlaylistPanel.java | 3 +- .../src/java/robodj/chooser/images/back.png | Bin 285 -> 572 bytes .../java/robodj/chooser/images/background.png | Bin 0 -> 8678 bytes .../src/java/robodj/chooser/images/browse.png | Bin 1076 -> 992 bytes .../src/java/robodj/chooser/images/edit.png | Bin 941 -> 1106 bytes .../src/java/robodj/chooser/images/pause.png | Bin 240 -> 367 bytes .../src/java/robodj/chooser/images/play.png | Bin 290 -> 382 bytes .../src/java/robodj/chooser/images/skip.png | Bin 282 -> 510 bytes .../src/java/robodj/chooser/images/stop.png | Bin 236 -> 340 bytes .../src/java/robodj/chooser/images/up.png | Bin 272 -> 0 bytes .../src/java/robodj/repository/Category.java | 20 +++- .../src/java/robodj/util/ButtonUtil.java | 19 ++-- .../src/java/robodj/util/FancyPanel.java | 77 ++++++++++++++++ 19 files changed, 228 insertions(+), 86 deletions(-) create mode 100644 projects/robodj/src/java/robodj/chooser/images/background.png delete mode 100644 projects/robodj/src/java/robodj/chooser/images/up.png create mode 100644 projects/robodj/src/java/robodj/util/FancyPanel.java diff --git a/projects/robodj/src/java/robodj/chooser/BrowsePanel.java b/projects/robodj/src/java/robodj/chooser/BrowsePanel.java index e130cc64..3c8cc110 100644 --- a/projects/robodj/src/java/robodj/chooser/BrowsePanel.java +++ b/projects/robodj/src/java/robodj/chooser/BrowsePanel.java @@ -1,34 +1,48 @@ // -// $Id: BrowsePanel.java,v 1.4 2003/05/04 18:16:06 mdb Exp $ +// $Id: BrowsePanel.java,v 1.5 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; +import java.awt.BorderLayout; +import java.util.ArrayList; + import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import com.samskivert.util.CollectionUtil; + import robodj.repository.*; -public class BrowsePanel extends JTabbedPane +public class BrowsePanel extends JPanel { public BrowsePanel () { - EntryList elist; - Category[] cats = Chooser.model.getCategories(); + setLayout(new BorderLayout(5, 5)); - // stick our tabs along the side and scroll if they don't fit - setTabPlacement(LEFT); - setTabLayoutPolicy(SCROLL_TAB_LAYOUT); + // obtain our categories + ArrayList cats = new ArrayList(); + CollectionUtil.addAll(cats, Chooser.model.getCategories()); + // add an "Uncategorized" category + cats.add(new Category(-1, "Uncategorized")); - // create a tab for each category - for (int i = 0; i < cats.length; i++) { - elist = new CategoryEntryList(cats[i].categoryid); - String tip = "Browse entries in '" + cats[i].name + "' category."; - addTab(cats[i].name, null, elist, tip); - } + final JList clist = new JList(cats.toArray()); + clist.getSelectionModel().setSelectionMode( + ListSelectionModel.SINGLE_SELECTION); + ListSelectionListener lsl = new ListSelectionListener() { + public void valueChanged (ListSelectionEvent lse) { + Category cat = (Category)clist.getSelectedValue(); + if (cat != null) { + _category.setCategory(cat.categoryid); + } + } + }; + clist.getSelectionModel().addListSelectionListener(lsl); + add(new JScrollPane(clist), BorderLayout.WEST); - // and add one for uncategorized entries - elist = new CategoryEntryList(-1); - addTab("Uncategorized", null, elist, - "Browse uncategorized entries."); - - setSelectedIndex(0); + add(_category = new CategoryEntryList(-1), BorderLayout.CENTER); + clist.setSelectedIndex(cats.size()-1); } + + protected CategoryEntryList _category; } diff --git a/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java b/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java index 8333549e..d812e7f0 100644 --- a/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java +++ b/projects/robodj/src/java/robodj/chooser/CategoryEntryList.java @@ -1,5 +1,5 @@ // -// $Id: CategoryEntryList.java,v 1.2 2003/05/04 18:16:06 mdb Exp $ +// $Id: CategoryEntryList.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -15,7 +15,18 @@ public class CategoryEntryList extends EntryList */ public CategoryEntryList (int categoryId) { - _categoryId = categoryId; + setCategory(categoryId); + } + + /** + * Updates our category. + */ + public void setCategory (int categoryId) + { + if (categoryId != _categoryId) { + _categoryId = categoryId; + Controller.postAction(this, "refresh"); + } } // documentation inherited diff --git a/projects/robodj/src/java/robodj/chooser/Chooser.java b/projects/robodj/src/java/robodj/chooser/Chooser.java index b6737027..a6a7dc97 100644 --- a/projects/robodj/src/java/robodj/chooser/Chooser.java +++ b/projects/robodj/src/java/robodj/chooser/Chooser.java @@ -1,5 +1,5 @@ // -// $Id: Chooser.java,v 1.12 2003/05/07 17:27:12 mdb Exp $ +// $Id: Chooser.java,v 1.13 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -9,6 +9,7 @@ import java.io.IOException; import java.util.Properties; import javax.swing.JOptionPane; +import javax.swing.UIManager; import com.samskivert.io.PersistenceException; import com.samskivert.jdbc.StaticConnectionProvider; @@ -17,6 +18,7 @@ import com.samskivert.util.StringUtil; import com.samskivert.swing.util.SwingUtil; import com.samskivert.util.ConfigUtil; import com.samskivert.util.PropertiesUtil; +import com.samskivert.util.RunAnywhere; import robodj.Log; import robodj.repository.Model; @@ -44,6 +46,15 @@ public class Chooser { boolean error = false; +// try { +// UIManager.setLookAndFeel( +// RunAnywhere.isLinux() ? +// "com.sun.java.swing.plaf.gtk.GTKLookAndFeel" : +// UIManager.getSystemLookAndFeelClassName()); +// } catch (Exception e) { +// Log.info("Failed to set GTK look and feel: " + e); +// } + // loop until the user provides us with a configuration that works // or requests to exit for (int ii = 0; ii < 100; ii++) { diff --git a/projects/robodj/src/java/robodj/chooser/ChooserFrame.java b/projects/robodj/src/java/robodj/chooser/ChooserFrame.java index bcc343a6..7393cc50 100644 --- a/projects/robodj/src/java/robodj/chooser/ChooserFrame.java +++ b/projects/robodj/src/java/robodj/chooser/ChooserFrame.java @@ -1,5 +1,5 @@ // -// $Id: ChooserFrame.java,v 1.11 2003/05/04 18:16:06 mdb Exp $ +// $Id: ChooserFrame.java,v 1.12 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -17,6 +17,7 @@ import robodj.Log; import robodj.Version; import robodj.repository.*; import robodj.util.ButtonUtil; +import robodj.util.FancyPanel; import robodj.util.RDJPrefs; import robodj.util.ServerControl.PlayingListener; @@ -31,16 +32,14 @@ public class ChooserFrame extends JFrame setDefaultCloseOperation(EXIT_ON_CLOSE); // we create a top-level panel to manage everything - JPanel top = new JPanel(); GroupLayout gl = new VGroupLayout(GroupLayout.STRETCH); gl.setOffAxisPolicy(GroupLayout.STRETCH); - top.setLayout(gl); - - // give ourselves a wee bit of a border + JPanel top = new FancyPanel(gl, ButtonUtil.getImage(BACKGROUND_PATH)); top.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); // the top of the UI is the browser and the playlist manager JTabbedPane tpane = new JTabbedPane(); + tpane.setBackground(BGCOLOR); PlaylistPanel ppanel = new PlaylistPanel(); String tip = "View and manipulate the playlist."; tpane.addTab("Playlist", null, ppanel, tip); @@ -102,6 +101,13 @@ public class ChooserFrame extends JFrame // now add our top-level panel (we'd not use this if we could set // a border on the content pane returned by the frame... alas) getContentPane().add(top, BorderLayout.CENTER); + SwingUtil.applyToHierarchy(top, new SwingUtil.ComponentOp() { + public void apply (Component comp) { + if (comp instanceof JPanel || comp instanceof JButton) { + ((JComponent) comp).setOpaque(false); + } + } + }); // add ourselves as a playing listener Chooser.scontrol.addPlayingListener(this); @@ -187,6 +193,9 @@ public class ChooserFrame extends JFrame protected static final String BACK_ICON_PATH = ICON_ROOT + "back.png"; protected static final String EXIT_ICON_PATH = ICON_ROOT + "exit.png"; + protected static final String BACKGROUND_PATH = + ICON_ROOT + "background.png"; + // button tips protected static final String PLAY_TIP = "Play"; protected static final String PAUSE_TIP = @@ -195,4 +204,7 @@ public class ChooserFrame extends JFrame protected static final String SKIP_TIP = "Skip to the next song"; protected static final String BACK_TIP = "Skip to the previous song"; protected static final String EXIT_TIP = "Exit"; + + // our common background color + protected static final Color BGCOLOR = new Color(0x7A719A); } diff --git a/projects/robodj/src/java/robodj/chooser/EntryController.java b/projects/robodj/src/java/robodj/chooser/EntryController.java index 086436e0..ad21785e 100644 --- a/projects/robodj/src/java/robodj/chooser/EntryController.java +++ b/projects/robodj/src/java/robodj/chooser/EntryController.java @@ -1,5 +1,5 @@ // -// $Id: EntryController.java,v 1.2 2003/05/19 02:53:25 mdb Exp $ +// $Id: EntryController.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -112,9 +112,8 @@ public abstract class EntryController extends ItemController Song song = SongItem.getSong(e.getSource()); Chooser.scontrol.append(song.entryid, song.songid, song.location); - } else if (cmd.equals("up")) { - // re-read the category beacuse this entry may have been - // recategorized + } else if (cmd.equals("refresh")) { + // re-read the category TaskMaster.invokeMethodTask("readEntries", this, this); } else if (cmd.equals("edit")) { diff --git a/projects/robodj/src/java/robodj/chooser/EntryList.java b/projects/robodj/src/java/robodj/chooser/EntryList.java index 46efb45c..02391e40 100644 --- a/projects/robodj/src/java/robodj/chooser/EntryList.java +++ b/projects/robodj/src/java/robodj/chooser/EntryList.java @@ -1,5 +1,5 @@ // -// $Id: EntryList.java,v 1.13 2003/05/04 18:16:06 mdb Exp $ +// $Id: EntryList.java,v 1.14 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -18,29 +18,17 @@ import robodj.Log; import robodj.repository.*; import robodj.util.ButtonUtil; -public abstract class EntryList extends JScrollPane +public abstract class EntryList extends JSplitPane implements ControllerProvider { public EntryList () { - // create the pane that will hold the buttons - GroupLayout gl = new VGroupLayout(GroupLayout.NONE); - gl.setOffAxisPolicy(GroupLayout.STRETCH); - gl.setJustification(GroupLayout.TOP); - gl.setGap(2); - _bpanel = new ScrollablePanel() { - // make the playlist fit the width of the scrolling viewport - public boolean getScrollableTracksViewportWidth () { - return true; - } - }; - _bpanel.setLayout(gl); + super(JSplitPane.VERTICAL_SPLIT); - // give ourselves a wee bit of a border - _bpanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); - - // set our viewport view - setViewportView(_bpanel); + setOpaque(false); + setDividerLocation(200); + setLeftComponent(new JScrollPane(_bpanel = createPanel())); + setRightComponent(new JScrollPane(_epanel = createPanel())); // use a special font for our name buttons _titleFont = new Font("Helvetica", Font.BOLD, 14); @@ -49,6 +37,27 @@ public abstract class EntryList extends JScrollPane _controller = createController(); } + /** + * Creates a panel configured for displaying entries or songs. + */ + protected JPanel createPanel () + { + GroupLayout gl = new VGroupLayout(GroupLayout.NONE); + gl.setOffAxisPolicy(GroupLayout.STRETCH); + gl.setJustification(GroupLayout.TOP); + gl.setGap(2); + JPanel panel = new ScrollablePanel() { + // make the playlist fit the width of the scrolling viewport + public boolean getScrollableTracksViewportWidth () { + return true; + } + }; + panel.setLayout(gl); + panel.setOpaque(false); + panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); + return panel; + } + public Controller getController () { return _controller; @@ -99,25 +108,18 @@ public abstract class EntryList extends JScrollPane _bpanel.add(new JLabel(getEmptyString())); } - // reset our scroll position so that we're displaying the top of - // the entry list. we'd like to save our scroll position and - // restore it when the user clicks "up", but as we're rebuilding - // the entry display the scroll bar is still configured for the - // old contents and we're not around when it gets configured with - // the new contents, so we can't ensure that the scrollbar has - // been properly configured before we adjust its position back to - // where we were... oh the complication. - clearScrollPosition(); + // reset our scroll position + clearScrollPosition((JScrollPane)getLeftComponent()); // we've removed and added components so we need to revalidate - revalidate(); - repaint(); + SwingUtil.setOpaque(_bpanel, false); + SwingUtil.refresh(_bpanel); } protected void populateSong (Entry entry) { // clear out any existing children - _bpanel.removeAll(); + _epanel.removeAll(); GroupLayout gl = new HGroupLayout(HGroupLayout.STRETCH); gl.setJustification(GroupLayout.LEFT); @@ -129,11 +131,6 @@ public abstract class EntryList extends JScrollPane label.setFont(_titleFont); header.add(label); - // add a button for getting the heck out of here - JButton upbtn = ButtonUtil.createControlButton( - UP_TIP, "up", ButtonUtil.getIcon(UP_ICON_PATH), true); - header.add(upbtn, GroupLayout.FIXED); - // create an edit button JButton ebtn = ButtonUtil.createControlButton( EDIT_TIP, "edit", ButtonUtil.getIcon(EDIT_ICON_PATH), true); @@ -151,7 +148,7 @@ public abstract class EntryList extends JScrollPane int catidx = ModelUtil.getCategoryIndex(Chooser.model, catid); catcombo.setSelectedIndex(catidx+1); - _bpanel.add(header, GroupLayout.FIXED); + _epanel.add(header, GroupLayout.FIXED); // sort the songs by position Comparator scomp = new Comparator() { @@ -167,26 +164,23 @@ public abstract class EntryList extends JScrollPane // and add buttons for every song for (int i = 0; i < entry.songs.length; i++) { - _bpanel.add(new SongItem(entry.songs[i], SongItem.BROWSER)); + _epanel.add(new SongItem(entry.songs[i], SongItem.BROWSER)); } - // reset our scroll position so that we're displaying the top of - // the song list - clearScrollPosition(); - // we've removed and added components so we need to revalidate - revalidate(); - repaint(); + SwingUtil.setOpaque(_epanel, false); + SwingUtil.refresh(_epanel); } - protected void clearScrollPosition () + protected void clearScrollPosition (JScrollPane pane) { - BoundedRangeModel model = getVerticalScrollBar().getModel(); + BoundedRangeModel model = pane.getVerticalScrollBar().getModel(); model.setValue(model.getMinimum()); } protected Controller _controller; protected JPanel _bpanel; + protected JPanel _epanel; protected Font _titleFont; diff --git a/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java b/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java index 360cc2a0..d1349797 100644 --- a/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java +++ b/projects/robodj/src/java/robodj/chooser/PlaylistPanel.java @@ -1,5 +1,5 @@ // -// $Id: PlaylistPanel.java,v 1.14 2003/05/04 18:16:06 mdb Exp $ +// $Id: PlaylistPanel.java,v 1.15 2004/01/26 16:10:55 mdb Exp $ package robodj.chooser; @@ -68,6 +68,7 @@ public class PlaylistPanel extends ControlledPanel GroupLayout bgl = new HGroupLayout(GroupLayout.NONE); bgl.setJustification(GroupLayout.RIGHT); JPanel cbar = new JPanel(bgl); + cbar.setOpaque(false); // add our control buttons _clearbut = ButtonUtil.createControlButton( diff --git a/projects/robodj/src/java/robodj/chooser/images/back.png b/projects/robodj/src/java/robodj/chooser/images/back.png index 5f563a517b75c8e2736022d6eaf564d6392dfffa..2271a614f7c50a85990e25b60b26f0b08ec02a02 100644 GIT binary patch delta 547 zcmV+;0^I$b0=xu}B!2{FK}|sb0I`n?{9y$E000JJOGiWi000000Qp0^e*gdg32;bR za{vGf5&!@T5&_cPe*6Fc00(qQO+^RN0tF5`3xC3|YybcOxk*GpRCwC$m9cKqP!xv0 zW9LTdz2G_<5>`@#sHjp;MI9hZ9|Kyd6o!I?T8YpFW<;eH=6}8buh9W{Vyj@u!V6GD z8!?5(hao`(#g1bph91ew@jd@{{_CS-xQv4EGjcb81>hPm2h@PG0-d#y*7sSUF`(m* zs%n9_cDvoPSzX-&w9|R6`}=Q-0Bd7SoMavF@+i(Zq9`i5mgA>Swx@QR3kbuIS{P0h zUw?3)l{+g_0e_W@To0gX49>Y+@yCz0h~s6JZZDMv1iu|vXEVijcb>7hc#CFpnP5IB zeMLQh!C*kOV#f2^!_M2(>kS%>g_$NM*MaZ*^e=vn=a2UGUQnCAN*p)QG{qQ$6acau zTx2;&lB9ERa7Yx@IsJM{#TY~c3J_U<>i|J;1<(KUx_{Mby;IeV&Gr_9G^O9~W32^| ze;d;|Yw^6lH;IV6SJjP&n{Cd|dzfk!H#rD}-(a|;JP+TS>}~{E6_K4J`GB>qG+JJfl`T5gHX}}kNREJZN7b5aXRlkYI+p;VCZkcVWs;@_9KF$iL>0}&D lD^S&SRUEx}`Fs68;}`xWptNBE_bC7X002ovPDHLkV1n5|_Q3!E delta 257 zcmV+c0sj8H1f2qqB!32COGiWi{{a60|De66lK=n!(n&-?RCwCumaz_kFc5}6jBkV@ z3%iLtfMK(%le;ktY%nsjO5()m-~)h~xX5Gh3b-J_K?6-Y82+TgT`%`v`(N4vaDWh~ z6|WF54IqvVtF2hiQHkvQWV1UZ0CiRRbsV_Ls*eM=u1f!H^Lk+@LYs4fW{iWND_|F9 zAKhe6U;#H>S7ZUXE)51Hmm$b?chN#OK{1p>M&v;xvTa%bvp#{-9x=uj|NY0_$ljtq zA&B-%RDGFEuC|MkB)tmZ*$B^8R(YB|04_9R%TdGFk^#;Om^pyy8a^)VgH<6i&;omh>56cCuZ@__`Qrl zEJAiO_V0ZRzaJ4!-xv2m{`nQn)4xfHi0OKN z|6Gem#MIUcMD|vmmzX!p^C8~WX3U4`>x<`?4O?kaziCywkytFH`GCUnJIA`g`JQ(FaMBw21TiZ9U{5CRtCR>vtm6PQ*;)-^0{LCml*GOd{e!g^O?hWw9nk0RUL9#X$f0&uZ(#qzqGsu#P^fZ%suudlBp*OjGWNoenbuGZ4d5fSx1h~4ZEXbr;-yITXT z7|S8ilBR4%Ow#6q_o8!Bv`gK&G0P4B=1Q$i25mAk1kc-D^RD#044NEZLE)L=$E18N zycQ55?wf4==DIRn-@ks-%hl5E#11LlaxJ@fQilGcQ8MY}361nW| zl3=s_yTpclJ#94pUz)g<5wlC5tj!6{R3eRgnCN7Fhb$j>-<__jZ35{}BuqLq2_+LB zeWq#s7~Q?$&_RDp1K!`?>AEfwk)`(eM|etPANTsb0c@N*Yf>{`7m$?d7qs{V^2M?5 z31`ZnB@DKh{aW_@hR{ftzc47d(2Z?IET%2Gtb1qJXr{Y&y4rl!yWi8KEvb*^%le7m znV(l3o!RGYy_lG;|NQ4S{r)|rS;ttCF&Eb)Q<&-Tm^VV4AATZ*kZ4kMY%C(K9cXu5 zGSKyLIH{@$rnb|uF1wEsXa84Ce-GE_xgcYVg-*!rG(u)s{_XDfL|m;=?>7mzh5v8A zwt-GFe+dy0gPdjGn9v$CT^}ExZsUgD=^5t2P04%(>^vow>0XP1cG~US-KkxTn1t^8 zL9!N)z?kU4oKz{V8j}MTGqGFcj%MzrDp^xi}Jl9F(Gh&Cenr3C3hx+Z=O?Gd{BgNS&>89H2wCOVL0OMR2< z3zjp*=QMwVkvJD5mV-Jjj&*+D41H+82EcVll|9uDzzE_=)TN zvkC9 z8u6IHp7)0dfnjtHG&9CY=?uRI0$-&m@~)d>P~0MNG)dR*?_VkUoj1o*<(4ge+eP!i$56k)vMb zLjW3)Ic}as!nA}`nh=vD0XBpi-K_8UR zN`%jpQp=V@LTo&=)3}w|%QP|l?v8+balx;#Wrx@ACfR;ZLT*0HFHbNr4!J4bB2;`I zFHN-E(v+;?1jYDQMi$awOC zf=#Z4Jcdgd|H+}a*?dbcZ)j&pi97qTcIsdjEU;pb%(O_$)EF9jW+QN#=kh{^j9B4^o;YTL2;U*Fo_z&dXn;ux+DT!ddzBxlRE17o!X*;C?|a$*wtdc#jY;{?@Cig@rgUgH@xb?VKt3}a ztwTu~uK<#dnahB$us|B+L)0wyFlv!3Z7B@Ygj@-u6meq&ZgGQ0!n-<78~S+sncn)k z=)P|^N44H+_*Tp`tpW=X(aUuu)y4!|DvUrv%eCZS`!U|A^@rZ4vz~}fJVLkZrfIJ& zT;!l2o*2X7Dp9UUkD+w6=5>Pbo0<%5;FP&81B3^C?e+2TvDq%nceHj9G0}Ccj2@&T zaKrA$O(aCEwJk+}B{|G)&IcBcb~#Bpt-7nM?;?kvi1)4DtOY0tU!JK&>D)`JyybPq z7V)#g>CuN5Zd~_ZQ*(uFrSyBJ)+AN-9ESe<`O~9ZFC0T%V2t^N{UOvff|^>{p|u%Z za#U$`*Cvu4Y>YvzH4WPNYku~n|5$-oROYJI=c=7)&Y*uTlsV0n{94+8%qMa{uiXwAPCDf0>?wiEi z_Z&wlPTB&Q-DiP#vXBWK;b|_G9*3005MH^9^Rt(yBU8 zVUnc{5+nkS4Zv85man z$Nc#zDvyk52M$sQjpgl`0`KE>(ZpDZ6`k;@k{6n+UPfCr1kBPhyq_UUYe%!Y|D;2_4lSZVmY(x_4RFGZt=(v$w-Dim|nw^r<}LCV`Gv+dcB<~ zVZ2fzCTZ-p-#1w-f1}BE&V|b8q1Gd!2*fV!%=21SH%?Le?phA1W_4i0+3 z5S;uH3Ulw>1hwvOljSnUS~-&SvzRz)E)n0Ik47SkxSzo{=#zGS!Ia8LK}FabLG!tr7Zg$V6W-< zIS+uvr8{X2u>!Q)E0EaB7bJ10d=H_N3WY5e}aH2%VN_I&;ryf_er23b`6X>jMa^` z>+9|PJ>~y*9wq^waVOYL>P3evVR-!ByQinIK5H?DnGi~32=<$^B8wrTVApA3T~m_o zp<_n5|AKb*-^WJ2@~rR)#wNCi9BGFYUETfmtmu{v?OhZ1vIa@U4VtfO%H@x#cl4i< zV=?n%K47aMoU=z8b;TMkoM&Tb1=t*RKe^x&3<{G}Olc$IBE<(t%p2p(+yj&~b4Sqw zkr7e&J@XZb7xel0cfqupP>i+QU{H4VJLT_@xK*!FZ5|UJ;Oy9#(YeYrqR-1A9w0|# zLj#A%P|-2PV?ASQQw`OyKrFKA)c8933XI?}hRLN*Elh7p?Ck67>*vbsS=338%ZDl% zvq#7S^5>8HL8`NGW0fc5k0yrj%5Vm9W$%bY1_SadiFQOK#6)Pv7Yf7vfQU^f6?w3D z5(s9o8V*QEOEG^e)lQbb!hN-4p(wz%~6Z+j`Nd^)>H$q&ywaSR@!7_)Gizb)`oGV=KD0o z0uClpT$Fi2*YDrIeAi9YOar`6tWdd6x%4V6*pX5T*A`jJvWHmYnOY?Nz?C)_-Uo4IxKMz972uZE{zRK($IzZIuuF`$~DtyRi*uIZZ>8(&`yX(elKbbt634sUT9-J=oSuYcvvm-WyhEf5_!Q7F{kE z?l~ML-Zn+B5=GH%GZU$k1ulyb=ftxyG6lU*)79E~*(!08eE@QvQXHTO#W6WMI(H%F zT^q+n>*01^x608uQ;AhAD=F6c1C>7I%&z-!xDP~WOqqq@Nw3uLnTzoDGdWC5W6)Z# z=-?O5oLTe%o(F;gOpQybK?_RG;)Zfj)xK(Mq_mPedrD7y+%xFTY*xg_v5$%&zn>q<>{v*3uCt0q%C)9|UGdLsE*67=^P^=EEF;TH=8U5d$a zOVo>H(Tax9{$osnT{}7kbw`%-wd?imEkj8dw{rJR?S-5kVm-7(x)^Yj@Nhzk8em+gFgV{cM6 z7-wCO!Fbk!n>7`8PK_V6GZ6=N2=pTFy}#shCd@w!H9k`-$v)kxc>Qq`iEP6>&Q&}i zq5%Xk*=xk5zL4V<+W143J%|Q!q3idm2Vf3H;e(laPGLu-)E^^SYSe ztu!}=5MYgUBT#9^Uk2TS6NhbyYr(p)XzsQT8C>2hCK1=vYroFe2}?tQp8MeAJj z={{D6i=-PFAUEfkCgK_lodZ0q7rI)2%*3E$Udw*JzP|oR`I-7-OkvEuq@W|gPTC4M zh@L7k;MD40X8x3>I5x)e7>7>B609k0eQA{1jDkv8?@yWpuhpXIl5sV^bz+C{uG>dk13G02Wi@s7LgE&sZc$ z7bi(aGvV;MWRojoM{dzxFP<6AxJTZL4nP8qxpkVNYOBVn@q(Up0sh+pA-b_adDx4^ z3EI(yn<2P>EfvEP%F{wrcv^@CzLapAK0wzHA)Ep-naAWAM`ljl?^NreEB#B* zRU?9Z#MzuheK=4_VWQyI*)Cm?ZAk;P#ZzttvHYrV&zADXA_*6F=X z+8iKN7>2ct3fs%qtcabSeYFcr1*%rxAZQJ0^a+>7QrD;9dnln}SmI8$o?_C|90*Rp zK*!i5k5k=7GfUbJ<*FiYVF zb!uypqG9BUh3nX`%)4LHSDX@${Qr?Q$16+B)MQoB`q&uCTd;NL2gX|M)-+x;0NHVA z3e1*djEQ1t><#5+?wA`C7R85k%pNgLUE|q?VI#B4a;kS?g-5BUEF?-g(y}9{6Q3!B z6Gf(T)&c@FnG&oyXG)+r=O-bn#OWDH3t}?YsnKM3IkhJJg0nPITAepm2U7o)8ecSM zAUiteE6_aT2`2$T@4Lr%GLd9+eOm5m+}YAF_KCS;G9gSGyuogiz$P;skg0%nTR6uq z*l}6AWVF;GwjP25YP0T`I-1}Hj#C;_3Cs?wky}K4y?=a^Ic%KlXRz7GRSD@Tv02f} ziyi9~C`B?(N(bU@dQ{7#To?jXC%YwIQXnnTZBWXws52LqGT(pWkSFZE&dF%B&mbZ1|z`o|b!_6MkEK+8iowwFUs z)HssrqZZtXgbr`+u<2B^&_PgFu7vxM6YBhX4GyStKS6kEk3r4PR8*6>Ke+%@*>t&2 zc>v||_GvG~##Ob+Dw$px6BOtF*R&Kqww9W(Oj|E*=O6b?P3C0T;hoM z%PDaji|G@yK0f}7>TLgH2<%V-2(!Ikb`9E~66lnwZb1!7{n2Nn4Fo0pP6n#Vo^vmQ zkhDK71M-t|4Dz`B+oN|}$UZtX5qd3D%M*(a&ls?4TWc4xIkw?YvmWrzvA~TpLy3r9 zt`}!8<3rwerJSGTL}c_q`TLvITMuq+UgA$hO&^J zj*$F%|NKl-PIgxDT(FnXQ)4!l$TcEkWE140q_FT2B}DO5NF7HOMemHJYIHf)NlqAB zH~|-812l660AlvTo~^{At8Bwv>?Y!SB%(0w%$7>oxC7|NlsL1x;UCrDY{zH zh_S7hf_6UwDwIUKhO7=ucTPCxr?do-Dh)s?)*ND!5`C}~a8Es9=<|huGuqlbJ&8s- z8>aW}b0}&}1Wl=7`B{A7d~6qt#5X^tqo?_%-YH)vWQ~$#G{$kiqevfoN;X`V*(gP~9xpK}kN~T1PL7o2waY%H~Xz^2} zgQs@sc%SgX!|WY@yEINz)Klugb{QwFXA;(+3KT4dG$$Lj6rfDPt$L0LC$v{q1)>bp zM&EL;3+Nh^qZ?Q0H21;@yU-UfYa~S18fKNc=vDIscbMdrW)~IaoTvS5ZfKs1&*xcd zCEKWllSzlaD;E<9wbNwu7(rZ5NupLT_U;4D^=3|NKBLChSm8vKiF}Pvo{Gqav(oTy z{I}W}PpLMYrY6SZ+}vYz-*aKwwa^aK08?RMMWcP?j(of&NaxrFZWPA|oBn)ymiSqc z=+Kd79+SKF(~TaFI7a1EL&iCzhH{WKj{XFzd>hs;LvU|kiMXbNIlA88-#u^M$2`)* z=+jF1?37$9t+etzSMQ^0pl}k$70RK*u>;mtpGQ|4L4x^wF36bgu#zJY(T~?3?sHVf zrUn0ggjPOz=~Od_T-4aI0Viu>=;-?W>$mS%*HQXw`RR@Awp6#-qjt_%$Npewrj7@) zd2AUeMMRqif>_6m&wxHO=%HEFg~|j@416|-yRsSPaH)xm6gH&tmCWDFahxsHte;J3 zQBu0zKR?P${^CRv=RNOgDnWwNiqn)Ln(^C{^- z(7pmgf;9tD){Eu4+2(v7T+2X)L+!Yx9P%o*=^X=kWl9H+&>>_ z5X+!W&P77l@>Sk$wPh}0gc;!bXYqvhn57n}%%(7ZdA+{9&l^w7upEBZS}}IKOJP9N z;Z0V$BTMu#JIcZXM1!_HBG@_1hTys=XoC1e9E(^WNMP!yrkayFBYL2KZ2TroCnI59 zr1pxPW(tvULv3eTyHeJX4s}+v$C0n$v%UeGgq2zLBMpSYSVPlU#3Av4usHE)>v*-T{_%7c z1ysZk0@{3o)>`yd5vPt7qlw^LHk|KY&6ss8`X~U&Q&=!)%Y>_#+A`-8EvB+lS8C%! zp4^g>aETf-R^555)3n>hb~dvZvnv#;b)`!`^@CMfzrsYaJn!y$dw(xo8^L^w3AadF z%#%T)KbAL^1mf#?sOQd^KQ;EDO~y!ap6WWFPSDGYiW9q;w*KAZ7-!rdMxQzhoB)z-<48NIaYRvAUYJd7d32l` zk&YMdaXOz#jz!3>eO4f`30_amlf?Gdm|}RR^XX3~Jo#rI*6FXQ2W^y|=sG*2`a(RX z%+4z|lytqnf9z+nm-#^66YHcXoN&tRv&aPakfNxYBKS-p7j2TM679cH1TBjw^)qrR+(<=|)CXw=c? z+G0aXKO!lH*>T2?y58PDBKI+r+9E>Pv_LzAd7ng^^X`7OfcBEZspcwY9w$XbqR3O= zF6G!5E3CJEtU`JnN<38@~=7!K5B9X;)8c76-4BpLt! z0ar;xK~z8lKK%Hz&A*Hh^O5-zJ4+ySCyqqV*mLfA{u^@rD{Z7s*~P~jV{ARk?pKUv z$#H5?<@lVs)=zOjH7Q)6DKhDBSQE1GP~!ctIna*l^YiZ#c=4fujklICg5v>0BE~jS zm=j-TPydE(rozi8JWk-x~OS(IEW*}(fr4V7^jJ=?|5M8hDuQZ0zU#~wV zHf1X3_QK>?32wZdky87CL!w4G5-T76`ETKVYMKDHG#68ZCPVumZcI&HW{0M*&%20w z>q#JTv?{6N$4#X0mSV7mblc#1LO5mvYRv$LxGE9-KixxGz^L_K9smFU07*qoM6N<$ Eg5_%52LJ#7 literal 0 HcmV?d00001 diff --git a/projects/robodj/src/java/robodj/chooser/images/browse.png b/projects/robodj/src/java/robodj/chooser/images/browse.png index 622b95a491ff268d9b71751be21eff236ba1c222..007958795d8490593b2a48c36ef2d107cba11714 100644 GIT binary patch delta 953 zcmV;q14jI`2;c{hHGcpJa7bBm000XT000XT0n*)m`~Uy|2XskIMF-Og6%!RSeQ0#0 z0000TbVXQnLvL+uWo~o;Lvm$dbY)~9cWHEJAXI2&AV*0}Q14_VZU6uSL`g(JRCwC0 zmd$HiWfaDL@9o5V42~leQA~-;AZS;XXabT|*3vq}I*G~7wtr4)$=bg_?U*k70%_Ai zg$i~NP~0TaFeut|B3Wi9gCUr-Aem|I$9s;8d+!@(Ix|gaUpU-zhne%7^PK0Lci;(} z$;nCYFyDI@&_}Qa@NX`c)8XM^ot>TC1o{Be2|zbCHnh=b=);ch`|A7q>ihe;wY8D3{1Y1mKzg6pKaf z-)|6w0e{B^2N^gJiU-gZfV8nFD$0AOPopRX6Mv=}XD@;u_yl3#e*fYN&!?_w4`8he z9J8%XN&l}vMGz6fFu+EZBbf{~iXIS5M~W16zLy40dyptBiXub=&ogc|T2I@NUS3|N zT>hMum6eAsu$Kmh7(Dhew^mmV2N2naJJl+4bAKh)tLtczskPQUV?T5XiktmDieklf zr^s5%TL#5EBtsJ>+Z*O~RdmrcQ$8vBV zC^(=^ocJXxXXl)iZ>{z1b=HFa6BOV9KH&HE_WF&p*Z8(&cz;n8^aEFc7+3}5?-oVj z3!R;v;g+)Q>+8(U%@szzKll03;o+f29L}8ijIY1?ft6yZV|MnB^+wRg&wj_wT_@Vx zxAhDS4N@r1v}|d4nx*Aw4jn!~nxqs8D=!TWcKVyGASjn>CqMk?gS`ONN);!9=Xofl z@I1xduH6hAdVhxEO6fh{-*u_GJE%rc)T+W-OB}~MBI za~2TU*!MHHeM1 zh<_7GrFF)~Cl|voxZd?tZqy{nMgUN&B($|hl*?6&u~=(ck~AfBPCx`>>%>Oa{nAvo z{POn;oIm$7J3F?2VMYI0Drp@6ymtHz?#|pIpI<_2i!r8giPFkgq3Yz;wJNB~S=Ta2 zQl@Ut0&?-`{kf59wN{Da*m3mvfj1wX|9@MxFbu99IMDsd@bJMWdwP0&0CnWZz(G8A zD^$CPDAjC}O+Z9MDYU?v6YS7bzO1Y z6>;4anVp@LOn)XLBO@acjYc!TLqJ)N?g@OAWJMMiZ^^*G8JU}#6A_WY!9i(mZZ<%; zNK(R7U0uDdej*Y)t+l=l*=&}|%1QuQTU+Vr>2WG5DvkryfC`lZOQll8<8eAWI}s7T zTaPK$sZ0e}A3V{jaYJ$s(#{LncrU-<G1F{$+0nZ?|*KhrKP3h+x6?$ICpk{3+IREeg9pu zOMi3p?f2F_pm%tnjb=2Fpu77p$wU&d7Ogdrx~%|w`tgS(lSziYxxm!aG;ZG0zahF4 zK`_>AOkj+m`|z9e_V&@#^c2=wPM!J^fa%l}(d|*@7Z#bAm?T`gg=lmKdtZGeSc}{( z27kuT*Y^QpEs5k9S{K;2Z!ZA59)E&#I>U3%KFzUX@6g)XLOPx1>oaFd>eYrZ(7M2( zLkCMdI(_;pdV7y^mNyRe06YUsm3XkUwB+k3pgfly z#|a3o{hmT8MRfbF0DOAt*Pvt+i{iQxWilBe;Tr#7t!iqm#Zd|?f}<2O)4#2rdS83- z>zK8&KEcmFU8Lp#<&^{}UcCw{78Q(.Cc2x`T0Wi$~;zBaxc_j&1W)QsxT zo>~jF!CNn_hg~o3p-5S%{tKSk!wM~476tK-SZ|3){ZRySs8onCm>*^|ooq6b$xPlJ zG$B82m$ENBFwZ;B&+qqn-xuESax{F4HxXNI+_7yN!!WvgIDZ`f8uj@2n91=YAB&jW6t4%Z-ZPMk|3L70-1GWb1v?t4Q_XOo~nMfqkH9@BiS_AIx z?sg~HFbp(J`(Mn)<8j8v$2*f;tyYQ0U#-~7K*fSS}esYxsrs-FOE`RaCuhlkx0 z_VEPHyKwlB6bS`M@L62FE8`>`|rRBLl54gYFjuZ8Bw+I`}qj<7HcLllceadmZ7m&?mb0f>U8iC>@pEXr4B;>Gi2QMGOH(+~5aYFpyj)5l_c zeN6yjV}D~qG+vx-9Gst@H|e=t4uE1Ij}QXeERt0J#xAMce=tBHe}T*ACz(v5++3Jl zIcUVYCYE)Lt7)3tecOYnm-yoIPdWZG#?16rWX=;j`E~|RPZgkT0-HL>=kskGsH%z# z=%o@Lhu$ZZ&eHGmV45bfRV16v;_K^2&1ULn>3`O95DtgyRRbgv37if{rPJ*FzQg#) z5VjDMbseYEfh@`F{;`Fo6#$r=oa~;UR>A>zkWATlkR=KMJAdvb-DgW9VfRr59O} z`0M19Uw(VR($W%{Oy>3kt;_565)9tw%WuMLuB|aK@rX=Dg{q0$rJ&|@?%wOe1q==j z-hTcjClUz`4i4JqR|vA%EV8IFKmQa(lCW$W98eK3H1q)vA5AbkJj~eG7*kVI_1LfV z=*vJlnLsNPFwF|CI|^>kTlC!vpxo)ju5>N_KP^QD;pyoSJs|u(uaH2vUA@-_%Ygvi bX?6MsnD~NDshW=e00000NkvXXu0mjf;v2-> diff --git a/projects/robodj/src/java/robodj/chooser/images/pause.png b/projects/robodj/src/java/robodj/chooser/images/pause.png index 4b132c04dffc5bced0528514b07f81adcfa4027b..1e03ef15642d43fc3e4075074cfda00916576cf3 100644 GIT binary patch delta 340 zcmV-a0jvJ-0q+8kB!2{FK}|sb0I`n?{9y$E000JJOGiWi>Hz2f;|0}L+W-In32;bR za{vGf5&!@T5&_cPe*6Fc00(qQO+^RN0tF5`6pHRCwC$l`(DtF%U(c zcgC=+R~uFe2Z%_UCP#w?j*>1nOT!Vi1Wy_iX#pcUi39~-8h^=tQ+&^tY{NshmP_y# z;OV&bKn?7U`!jB4U(UHA<9EPL%gpQwzbH-c3Shln(f2*7%4W0uX{LCI0RSNcUYASu zheH-mp7fexjP&z)HqSMP0Mp3?RUw2hYNmMc1Z^Ae-qVC8i~lO3zv^ZN5n!=+rfmbw zY#c?3-(N&^JxxVLkjiE85`#T}ilVAiBIDbc;3WnQKt$-e4)6V_nc^jS`>)3?HNnoz mIIUqAJ}+_LKQ&4@>AG!8~B7|!{CkxfXk(Ks0F7WCA3Fi@+? zgqj6UMf2vZIGvOfWxPy47LC#D|;kR8SPT~!As9^C5O;742^QGm2*MR4oI}EP?%^2ELVspCrmD^C=37_3UsY1D z%#4U(<{YSi?>4}SVP+E;1I?m~L~= z<|?=50?0uA>s$VFLE^W4?we22wAtL8MRqR(zz;6^J!40mG&%qP002ovPDHLkV1lUp Bn*aa+ delta 262 zcmV+h0r~#^0-^$tB!32COGiWi{{a60|De66lK=n!*GWV{RCwCWmLU$pKoCVAgc}i{ zrk;czfYeco!V^+a*UIWznxHBX9H5KA&|~xpizy_K5W3Udgh^J6`EPdrWOe|2AO*DL zlLFHbkY|V0Hd@cH8P)mDW_Kz8blb!_PXcSz=SiU3CVu9;C4ZLUr8&lNm;mOk0ks5T z`b5SMi3dgysmZ+|CV+(mVggWKAXeM7{&B0pZTcy$T$$WUTngwdE&&*cOWIVq92H7p z)?bb5VSsGE#MYPDX#p?+ilV$mQRoqcp0&!$>IQJ3TU(9})|LwJADL5#9vcD3TL1t6 M07*qoM6N<$g6ME{%>V!Z diff --git a/projects/robodj/src/java/robodj/chooser/images/skip.png b/projects/robodj/src/java/robodj/chooser/images/skip.png index 5e3d79592ea110975d5d7cc59e78a7651ca0665a..b1d259a44ad95060090238c1f6fb01d8e5ad65d9 100644 GIT binary patch delta 484 zcmVG_1urR}UZ}s3_g;b3Pt^xDN5-2C<84Hc&xTQMJs^&GF^)Q66#% zFdPnPsJ%l26|4$smFZTC8QmTepW3AjIE zN_A5`!5vuGzM^^vM7IXokRe5`Z38@;01vp@0%(f^OcnRdfX9$FRRK7Pu@S#Te*(z% zOH6&4omSsPMN!^_hn+a07*qoM6N<$ Eg5j%irvLx| diff --git a/projects/robodj/src/java/robodj/chooser/images/stop.png b/projects/robodj/src/java/robodj/chooser/images/stop.png index 6234e569d3b3e1f2df8fd28418711b0595a2ef94..e7c84a2b22550823b357b388d601813fd6eadb51 100644 GIT binary patch delta 313 zcmV-90mlC90n`GJB!2{FK}|sb0I`n?{9y$E000JJOGiWi>Hz2f;|0}L+W-In32;bR za{vGf5&!@T5&_cPe*6Fc00(qQO+^RN0tF5w2Gug`4gdfE(Md!>RCwC$ltB)HFc3u_ z%oLR&2#FlP=+=!#(~Ta*)4AamBDi6tpcrY4i9c!5On>LkpMRzUe|#H3M{Ehq+r0xW zKnyf3zq#WpPy*+nqT4pfTdT!GGVKru0rvYHd7h)HFDp76j=g8Sx6O?8YDIOue)I-U z%d6{}Jj+HGr~xKXgsNa>ejFr;;hZD3_#=VP_dn=uQBf>N5+k1dpaTG=(+Mhqgu&05AX40_*{hB!32COGiWi{{a60|De66lK=n!p-DtRRCwBBU|?XdWnf_FW?*3W zPi5TAz`$V4$iTobrKiq2J1N4Hftq0B&Z`WGg{$W=FfcIue|N3n|CAOVs=0nji_iae z*BW4a1{4mJ0NhL_1{#A=3kU)hVj_%yJmY8_j9M@P@&V&$97zll3wmli7^qccLd}Aw zqIvUHoK8xLvS3JxvY?vFS8Tk%z`($;mjT*rSx$py%SHwU23r72`FbPUU)@Cj0000< KMNUMnLSTY_e_J~M diff --git a/projects/robodj/src/java/robodj/chooser/images/up.png b/projects/robodj/src/java/robodj/chooser/images/up.png deleted file mode 100644 index 03033bd406726be930b247d8ecc5eb9d118e2858..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt^fJzX3_ zDsDZUwvn&NK%mXO!~bxWPs9!1CyYF^W9Q!KO-yK>I5Sj8-HmX~I(=`0-yMmPrKG&BmJCn5W)oC5G z*xBDK^*bl9`O6=lC9AOEA&UUREjI<;7iX(`+kOb2x!=^o_@XoW{>w#2J8b7=H~d`E zaDV^FbLSuYm)kAL-1S&$rT*nA-q?`PudyptTvQiEJT3jqup{yKw9U;MmohF=H&kzu UYv4;21A2(T)78&qol`;+08@H&zW@LL diff --git a/projects/robodj/src/java/robodj/repository/Category.java b/projects/robodj/src/java/robodj/repository/Category.java index ff2ea8b6..41b90cab 100644 --- a/projects/robodj/src/java/robodj/repository/Category.java +++ b/projects/robodj/src/java/robodj/repository/Category.java @@ -1,5 +1,5 @@ // -// $Id: Category.java,v 1.1 2000/11/08 06:42:57 mdb Exp $ +// $Id: Category.java,v 1.2 2004/01/26 16:10:55 mdb Exp $ package robodj.repository; @@ -14,4 +14,22 @@ public class Category /** The name of this category. */ public String name; + + /** Creates an uninitialized category instance. */ + public Category () + { + } + + /** Creates an initialized category instance. */ + public Category (int categoryid, String name) + { + this.categoryid = categoryid; + this.name = name; + } + + /** Generates a string representation of this instance. */ + public String toString () + { + return name; + } } diff --git a/projects/robodj/src/java/robodj/util/ButtonUtil.java b/projects/robodj/src/java/robodj/util/ButtonUtil.java index be5bfaf1..2c7a4e8e 100644 --- a/projects/robodj/src/java/robodj/util/ButtonUtil.java +++ b/projects/robodj/src/java/robodj/util/ButtonUtil.java @@ -1,5 +1,5 @@ // -// $Id: ButtonUtil.java,v 1.2 2003/05/04 18:16:07 mdb Exp $ +// $Id: ButtonUtil.java,v 1.3 2004/01/26 16:10:55 mdb Exp $ package robodj.util; @@ -23,26 +23,31 @@ import robodj.Log; */ public class ButtonUtil { - public static ImageIcon getIcon (String iconPath) + public static Image getImage (String imagePath) { try { - InputStream imgin = ButtonUtil.class.getResourceAsStream(iconPath); + InputStream imgin = ButtonUtil.class.getResourceAsStream(imagePath); if (imgin != null) { - Image image = ImageIO.read(imgin); - return new ImageIcon(image); + return ImageIO.read(imgin); } } catch (IOException ioe) { - Log.warning("Unable to load icon [path=" + iconPath + + Log.warning("Unable to load image [path=" + imagePath + ", error=" + ioe + "]."); } catch (Exception e) { - Log.warning("Error loading icon [path=" + iconPath + "]."); + Log.warning("Error loading image [path=" + imagePath + "]."); Log.logStackTrace(e); } return null; } + public static ImageIcon getIcon (String iconPath) + { + Image image = getImage(iconPath); + return image == null ? null : new ImageIcon(image); + } + public static JButton createControlButton ( String tooltip, String action, String iconPath) { diff --git a/projects/robodj/src/java/robodj/util/FancyPanel.java b/projects/robodj/src/java/robodj/util/FancyPanel.java new file mode 100644 index 00000000..5823e03e --- /dev/null +++ b/projects/robodj/src/java/robodj/util/FancyPanel.java @@ -0,0 +1,77 @@ +// +// $Id: FancyPanel.java,v 1.1 2004/01/26 16:10:55 mdb Exp $ + +package robodj.util; + +import java.awt.Graphics; +import java.awt.Image; +import java.awt.LayoutManager; +import java.awt.Shape; + +import com.samskivert.swing.ScrollablePanel; + +/** + * A {@link JPanel} that displays an image in its background. + */ +public class FancyPanel extends ScrollablePanel +{ + public FancyPanel (Image image) + { + _image = image; + } + + public FancyPanel (LayoutManager lmgr, Image image) + { + super(lmgr); + _image = image; + } + + public void paintComponent (Graphics gfx) + { + int x = 0, y = 0; + int width = this.getWidth(); + int height = this.getHeight(); + int iwidth = _image.getWidth(null), + iheight = _image.getHeight(null); + int xnum = width / iwidth, xplus = width % iwidth; + int ynum = height / iheight, yplus = height % iheight; + Shape oclip = gfx.getClip(); + + for (int ii=0; ii < ynum; ii++) { + // draw the full copies of the image across + int xx = x; + for (int jj=0; jj < xnum; jj++) { + gfx.drawImage(_image, xx, y, null); + xx += iwidth; + } + + if (xplus > 0) { + gfx.clipRect(xx, y, xplus, iheight); + gfx.drawImage(_image, xx, y, null); + gfx.setClip(oclip); + } + + y += iheight; + } + + if (yplus > 0) { + int xx = x; + for (int jj=0; jj < xnum; jj++) { + gfx.clipRect(xx, y, iwidth, yplus); + gfx.drawImage(_image, xx, y, null); + gfx.setClip(oclip); + xx += iwidth; + } + + if (xplus > 0) { + gfx.clipRect(xx, y, xplus, yplus); + gfx.drawImage(_image, xx, y, null); + gfx.setClip(oclip); + } + } + + super.paintComponent(gfx); + } + + protected Image _image; +}