Added facilities for automatically fiddling the case of the artist, title

and track names according to some canonicalization rules.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@146 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2001-06-05 17:41:00 +00:00
parent 4931ffcf90
commit bfb7a6e925
2 changed files with 127 additions and 2 deletions
@@ -1,5 +1,5 @@
// //
// $Id: CDInfoEditor.java,v 1.2 2001/03/18 06:58:55 mdb Exp $ // $Id: CDInfoEditor.java,v 1.3 2001/06/05 17:41:00 mdb Exp $
package robodj.importer; package robodj.importer;
@@ -8,6 +8,7 @@ import java.awt.Color;
import java.awt.event.*; import java.awt.event.*;
import javax.swing.*; import javax.swing.*;
import javax.swing.table.*; import javax.swing.table.*;
import java.util.StringTokenizer;
import com.samskivert.swing.*; import com.samskivert.swing.*;
import com.samskivert.net.cddb.CDDB; import com.samskivert.net.cddb.CDDB;
@@ -83,6 +84,16 @@ public class CDInfoEditor
JScrollPane tscroll = new JScrollPane(_trackTable); JScrollPane tscroll = new JScrollPane(_trackTable);
add(tscroll); add(tscroll);
JPanel butPanel = new JPanel(new HGroupLayout(GroupLayout.NONE));
JButton fixCaseBtn = new JButton("Canonicalize text");
fixCaseBtn.addActionListener(new ActionListener () {
public void actionPerformed (ActionEvent ae) {
fixCase();
}
});
butPanel.add(fixCaseBtn);
add(butPanel, GroupLayout.FIXED);
selectDetail(0); selectDetail(0);
} }
@@ -106,6 +117,91 @@ public class CDInfoEditor
return _tmodel.getTrackNames(); return _tmodel.getTrackNames();
} }
/**
* Cleans up the case of the track, title and artist text. This
* currently means capitalizing every word and performing some case
* fixups according to an exception list.
*/
public void fixCase ()
{
// clean up the title
String title = fixCase(_tmodel.getTitle());
_tmodel.setTitle(title);
_titText.setText(title);
// clean up the artist
String artist = fixCase(_tmodel.getArtist());
_tmodel.setArtist(artist);
_artText.setText(artist);
// clean up the tracks
String[] names = getTrackNames();
for (int i = 0; i < names.length; i++) {
_tmodel.setTrackName(i, fixCase(names[i]));
}
}
/**
* Fixes the case of the supplied string according to our case fixing
* rules.
*/
protected String fixCase (String text)
{
StringTokenizer tok = new StringTokenizer(text);
StringBuffer ntbuf = new StringBuffer();
String excep;
for (int i = 0; tok.hasMoreTokens(); i++) {
String token = tok.nextToken();
if (i > 0) {
ntbuf.append(" ");
}
if ((excep = getException(token)) != null) {
// if this token should be overridden explicitly, do so
ntbuf.append(excep);
} else if (Character.isLowerCase(token.charAt(0))) {
// if the first character is lower case, fix it
ntbuf.append(Character.toUpperCase(token.charAt(0)));
if (token.length() > 1) {
ntbuf.append(token.substring(1));
}
} else {
// otherwise don't mess with it
ntbuf.append(token);
}
}
// report modifications for now
String ntext = ntbuf.toString();
// if (!ntext.equals(text)) {
// System.out.println("Adjusted case '" + text + "' to '" +
// ntext + "'.");
// }
return ntext;
}
/**
* Returns the exception string for this token if there is one
* otherwise null.
*/
protected String getException (String token)
{
// we could toLowerCase() the token and keep all this stuff in a
// hashtable, but the list is small and we'd rather not create a
// zillion objects with all those toLowerCase() calls, so we just
// search the exception list linearly
for (int i = 0; i < OVERRIDE_KEYS.length; i++) {
if (token.equalsIgnoreCase(OVERRIDE_KEYS[i])) {
return OVERRIDE_VALS[i];
}
}
return null;
}
protected void selectDetail (int index) protected void selectDetail (int index)
{ {
_tmodel.selectDetail(index); _tmodel.selectDetail(index);
@@ -119,4 +215,12 @@ public class CDInfoEditor
protected JTable _trackTable; protected JTable _trackTable;
protected DetailTableModel _tmodel; protected DetailTableModel _tmodel;
// used in case fixups
protected static String[] OVERRIDE_KEYS = {
"vs.", "dj", "/"
};
protected static String[] OVERRIDE_VALS = {
"vs.", "DJ", "-"
};
} }
@@ -1,5 +1,5 @@
// //
// $Id: DetailTableModel.java,v 1.1 2000/12/10 07:02:09 mdb Exp $ // $Id: DetailTableModel.java,v 1.2 2001/06/05 17:41:00 mdb Exp $
package robodj.importer; package robodj.importer;
@@ -48,6 +48,27 @@ public class DetailTableModel
return _artist; return _artist;
} }
// this does not cause the UI displaying the title to update because
// it isn't listening to the model, we're only listening to it
public void setTitle (String title)
{
_title = title;
}
// this does not cause the UI displaying the artist to update because
// it isn't listening to the model, we're only listening to it
public void setArtist (String artist)
{
_artist = artist;
}
// this does cause the track display to update
public void setTrackName (int index, String name)
{
_names[index] = name;
fireTableCellUpdated(index, TITLE_COLUMN);
}
public String[] getTrackNames () public String[] getTrackNames ()
{ {
return _names; return _names;