diff --git a/livesupport/products/gLiveSupport/src/GLiveSupport.cxx b/livesupport/products/gLiveSupport/src/GLiveSupport.cxx index 6a2f50fef..e6a8a2c5d 100644 --- a/livesupport/products/gLiveSupport/src/GLiveSupport.cxx +++ b/livesupport/products/gLiveSupport/src/GLiveSupport.cxx @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.19 $ + Version : $Revision: 1.20 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/GLiveSupport.cxx,v $ ------------------------------------------------------------------------------*/ @@ -389,40 +389,40 @@ GLiveSupport :: showLoggedInUI(void) throw () } +/*------------------------------------------------------------------------------ + * Determine the length of an audio file + *----------------------------------------------------------------------------*/ +Ptr::Ref +LiveSupport :: GLiveSupport :: +GLiveSupport :: getPlaylength(Ptr::Ref uri) + throw (std::invalid_argument) +{ + Ptr::Ref playlength; + audioPlayer->open(*uri); + playlength = audioPlayer->getPlaylength(); + audioPlayer->close(); + + return playlength; +} + + /*------------------------------------------------------------------------------ * Upload a file to the server. *----------------------------------------------------------------------------*/ -Ptr::Ref +void LiveSupport :: GLiveSupport :: -GLiveSupport :: uploadFile(Ptr::Ref title, - Ptr::Ref fileName) +GLiveSupport :: uploadFile(Ptr::Ref audioClip) throw (XmlRpcException) { - // create a URI from the file name - Ptr::Ref uri(new std::string("file://")); - *uri += *fileName; - - // determine the playlength of the audio clip - Ptr::Ref playlength; - try { - audioPlayer->open(*uri); - playlength = audioPlayer->getPlaylength(); - audioPlayer->close(); - } catch (std::invalid_argument &e) { - throw XmlRpcException(e.what()); - } - - // create and upload an AudioClip object - Ptr::Ref audioClip(new AudioClip(title, - playlength, - uri)); +std::cerr << "GLiveSupport :: uploadFile #1" << std::endl; storage->storeAudioClip(sessionId, audioClip); +std::cerr << "GLiveSupport :: uploadFile #2" << std::endl; // add the uploaded file to the DJ Bag, and update it djBagContents->push_front(audioClip); +std::cerr << "GLiveSupport :: uploadFile #3" << std::endl; masterPanel->updateDjBagWindow(); - - return audioClip; +std::cerr << "GLiveSupport :: uploadFile #4" << std::endl; } diff --git a/livesupport/products/gLiveSupport/src/GLiveSupport.h b/livesupport/products/gLiveSupport/src/GLiveSupport.h index df2aabc7a..4232efc17 100644 --- a/livesupport/products/gLiveSupport/src/GLiveSupport.h +++ b/livesupport/products/gLiveSupport/src/GLiveSupport.h @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.19 $ + Version : $Revision: 1.20 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/GLiveSupport.h,v $ ------------------------------------------------------------------------------*/ @@ -100,7 +100,7 @@ class MasterPanelWindow; * respective documentation. * * @author $Author: maroy $ - * @version $Revision: 1.19 $ + * @version $Revision: 1.20 $ * @see LocalizedObject#getBundle(const xmlpp::Element &) * @see AuthenticationClientFactory * @see StorageClientFactory @@ -355,17 +355,26 @@ class GLiveSupport : public LocalizedConfigurable, void showLoggedInUI(void) throw (); + /** + * Determine the length of an audio file, base on a URI to the file. + * + * @param uri an URI to a binary audio file + * @return the length of the file + * @exception std::invalid_argument if there is no file at the + * specified URI + */ + Ptr::Ref + getPlaylength(Ptr::Ref uri) + throw (std::invalid_argument); + /** * Upload a file to the storage. * - * @param title the title of the audio clip. - * @param fileName the full filename of the audio clip. - * @return the audio clip that was uploaded. + * @param audioClip the file to upload * @exception XmlRpcException on upload failures. */ - Ptr::Ref - uploadFile(Ptr::Ref title, - Ptr::Ref fileName) + void + uploadFile(Ptr::Ref audioClip) throw (XmlRpcException); /** diff --git a/livesupport/products/gLiveSupport/src/LoginWindow.cxx b/livesupport/products/gLiveSupport/src/LoginWindow.cxx index 82f66c4be..1f1e745af 100644 --- a/livesupport/products/gLiveSupport/src/LoginWindow.cxx +++ b/livesupport/products/gLiveSupport/src/LoginWindow.cxx @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.7 $ + Version : $Revision: 1.8 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/LoginWindow.cxx,v $ ------------------------------------------------------------------------------*/ @@ -43,6 +43,7 @@ using namespace Glib; using namespace LiveSupport::Core; +using namespace LiveSupport::Widgets; using namespace LiveSupport::GLiveSupport; /* =================================================== local data structures */ @@ -71,6 +72,8 @@ LoginWindow :: LoginWindow (Ptr::Ref gLiveSupport, Ptr::Ref widgetFactory = WidgetFactory::getInstance(); + set_default_size(350, 265); + try { set_title(*getResourceUstring("windowTitle")); loginLabel = Gtk::manage( diff --git a/livesupport/products/gLiveSupport/src/MasterPanelWindow.cxx b/livesupport/products/gLiveSupport/src/MasterPanelWindow.cxx index 41dfccecc..a58f56f7b 100644 --- a/livesupport/products/gLiveSupport/src/MasterPanelWindow.cxx +++ b/livesupport/products/gLiveSupport/src/MasterPanelWindow.cxx @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.12 $ + Version : $Revision: 1.13 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/MasterPanelWindow.cxx,v $ ------------------------------------------------------------------------------*/ @@ -94,7 +94,6 @@ MasterPanelWindow :: MasterPanelWindow (Ptr::Ref gLiveSupport, vuMeterBin = Gtk::manage(widgetFactory->createBlueBin()); vuMeterBin->add(*vuMeterWidget); vuMeterBin->set_size_request(400, 40); - // set up the next playing widget nextPlayingWidget = Gtk::manage(new Gtk::Label("next playing")); nextPlayingBin = Gtk::manage(widgetFactory->createBlueBin()); @@ -121,7 +120,6 @@ MasterPanelWindow :: MasterPanelWindow (Ptr::Ref gLiveSupport, bottomBar->attach(*userInfoAlignment, 1, 2, 0, 1, Gtk::SHRINK|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 5, 0); - // set up the main window, and show everything // all the localized widgets were set up in changeLanguage() set_border_width(10); @@ -143,7 +141,6 @@ MasterPanelWindow :: MasterPanelWindow (Ptr::Ref gLiveSupport, layout->attach(*bottomBar, 0, 4, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - add(*layout); // set the background to white diff --git a/livesupport/products/gLiveSupport/src/UploadFileWindow.cxx b/livesupport/products/gLiveSupport/src/UploadFileWindow.cxx index d1eb02d49..89e9a1d92 100644 --- a/livesupport/products/gLiveSupport/src/UploadFileWindow.cxx +++ b/livesupport/products/gLiveSupport/src/UploadFileWindow.cxx @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.4 $ + Version : $Revision: 1.5 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/UploadFileWindow.cxx,v $ ------------------------------------------------------------------------------*/ @@ -34,6 +34,8 @@ #endif #include +#include +#include #include #include #include @@ -43,6 +45,7 @@ #include "UploadFileWindow.h" +using namespace LiveSupport::Widgets; using namespace LiveSupport::GLiveSupport; /* =================================================== local data structures */ @@ -62,50 +65,114 @@ using namespace LiveSupport::GLiveSupport; UploadFileWindow :: UploadFileWindow (Ptr::Ref gLiveSupport, Ptr::Ref bundle) throw () - : LocalizedObject(bundle) + : WhiteWindow("", + 0xffffff, + WidgetFactory::getInstance()->getWhiteWindowCorners()), + LocalizedObject(bundle) { this->gLiveSupport = gLiveSupport; + fileName.reset(new std::string()); + isFileGood = false; + Ptr::Ref wf = WidgetFactory::getInstance(); + try { + // generic resources set_title(*getResourceUstring("windowTitle")); - chooseFileLabel.reset(new Gtk::Label( + chooseFileLabel = Gtk::manage(new Gtk::Label( *getResourceUstring("chooseFileLabel"))); - fileNameEntry.reset(new Gtk::Entry()); - chooseFileButton.reset(new Gtk::Button( + fileNameEntryBin = Gtk::manage(wf->createEntryBin()); + fileNameEntry = fileNameEntryBin->getEntry(); + chooseFileButton = Gtk::manage(wf->createButton( *getResourceUstring("chooseFileButtonLabel"))); - nameLabel.reset(new Gtk::Label( - *getResourceUstring("nameLabel"))); - nameEntry.reset(new Gtk::Entry()); - uploadButton.reset(new Gtk::Button( + + // main section resources + titleLabel = Gtk::manage(new Gtk::Label( + *getResourceUstring("titleLabel"), + Gtk::ALIGN_RIGHT)); + titleEntryBin = Gtk::manage(wf->createEntryBin()); + titleEntry = titleEntryBin->getEntry(); + + creatorLabel = Gtk::manage(new Gtk::Label( + *getResourceUstring("creatorLabel"), + Gtk::ALIGN_RIGHT)); + creatorEntryBin = Gtk::manage(wf->createEntryBin()); + creatorEntry = creatorEntryBin->getEntry(); + + genreLabel = Gtk::manage(new Gtk::Label( + *getResourceUstring("genreLabel"), + Gtk::ALIGN_RIGHT)); + genreEntryBin = Gtk::manage(wf->createEntryBin()); + genreEntry = genreEntryBin->getEntry(); + + fileFormatLabel = Gtk::manage(new Gtk::Label( + *getResourceUstring("fileFormatLabel"), + Gtk::ALIGN_RIGHT)); + fileFormatComboBox = Gtk::manage(wf->createComboBoxText()); + + lengthLabel = Gtk::manage(new Gtk::Label( + *getResourceUstring("lengthLabel"), + Gtk::ALIGN_RIGHT)); + lengthValueLabel = Gtk::manage(new Gtk::Label()); + + // build up the notepad for the different metadata sections + mainSection = Gtk::manage(new Gtk::Alignment()); + metadataNotebook = Gtk::manage(new Notebook()); + metadataNotebook->appendPage(*mainSection, + *getResourceUstring("mainSectionLabel")); + + // buttons, etc. + uploadButton = Gtk::manage(wf->createButton( *getResourceUstring("uploadButtonLabel"))); - closeButton.reset(new Gtk::Button( + closeButton = Gtk::manage(wf->createButton( *getResourceUstring("closeButtonLabel"))); - statusBar.reset(new Gtk::Label( + statusBar = Gtk::manage(new Gtk::Label( *getResourceUstring("statusBar"))); } catch (std::invalid_argument &e) { // TODO: signal error std::cerr << e.what() << std::endl; } + // build up the main section + // TODO: don't hard-code supported file format types + fileFormatComboBox->append_text("mp3"); + fileFormatComboBox->set_active_text("mp3"); + mainLayout = Gtk::manage(new Gtk::Table()); + mainLayout->attach(*titleLabel, 0, 1, 0, 1); + mainLayout->attach(*titleEntryBin, 1, 2, 0, 1); + mainLayout->attach(*creatorLabel, 0, 1, 1, 2); + mainLayout->attach(*creatorEntryBin, 1, 2, 1, 2); + mainLayout->attach(*genreLabel, 0, 1, 2, 3); + mainLayout->attach(*genreEntryBin, 1, 2, 2, 3); + mainLayout->attach(*fileFormatLabel, 2, 3, 0, 1); + mainLayout->attach(*fileFormatComboBox, 3, 4, 0, 1); + mainLayout->attach(*lengthLabel, 2, 3, 1, 2); + mainLayout->attach(*lengthValueLabel, 3, 4, 1, 2); + mainSection->add(*mainLayout); + + // build up the button bar + buttonBar = Gtk::manage(new Gtk::HBox()); + buttonBar->add(*closeButton); + buttonBar->add(*uploadButton); + // set up the layout, which is a button box - layout.reset(new Gtk::Table()); + layout = Gtk::manage(new Gtk::Table()); // set up the main window, and show everything - set_border_width(10); layout->attach(*chooseFileLabel, 0, 1, 0, 1); - layout->attach(*fileNameEntry, 1, 2, 0, 1); - layout->attach(*chooseFileButton, 2, 3, 0, 1); - layout->attach(*nameLabel, 0, 1, 1, 2); - layout->attach(*nameEntry, 1, 2, 1, 2); - layout->attach(*uploadButton, 1, 2, 2, 3); - layout->attach(*closeButton, 1, 2, 3, 4); - layout->attach(*statusBar, 0, 3, 4, 5); + layout->attach(*fileNameEntryBin, 0, 1, 1, 2); + layout->attach(*chooseFileButton, 1, 2, 1, 2); + layout->attach(*metadataNotebook, 0, 2, 2, 3); + layout->attach(*buttonBar, 0, 2, 3, 4); + layout->attach(*statusBar, 0, 2, 4, 5); add(*layout); // bind events chooseFileButton->signal_clicked().connect(sigc::mem_fun(*this, &UploadFileWindow::onChooseFileButtonClicked)); + fileNameEntry->signal_focus_out_event().connect(sigc::mem_fun(*this, + &UploadFileWindow::onFileNameEntryLeave)); uploadButton->signal_clicked().connect(sigc::mem_fun(*this, &UploadFileWindow::onUploadButtonClicked)); closeButton->signal_clicked().connect(sigc::mem_fun(*this, @@ -137,12 +204,60 @@ UploadFileWindow :: onChooseFileButtonClicked(void) throw () int result = dialog->run(); if (result == Gtk::RESPONSE_OK) { - fileName.reset(new std::string(dialog->get_filename())); - fileNameEntry->set_text(*fileName); + fileNameEntry->set_text(dialog->get_filename()); + updateFileInfo(); } } +/*------------------------------------------------------------------------------ + * Update the file information to upload. + *----------------------------------------------------------------------------*/ +void +UploadFileWindow :: updateFileInfo(void) throw () +{ + std::string newFileName = fileNameEntry->get_text().raw(); + + if (*fileName != newFileName) { + // see if the file exists, and is readable + std::ifstream file(newFileName.c_str()); + if (!file.good()) { + isFileGood = false; + file.close(); + return; + } + file.close(); + isFileGood = true; + fileName.reset(new std::string(newFileName)); + + fileURI.reset(new std::string("file://")); + *fileURI += *fileName; + + playlength = gLiveSupport->getPlaylength(fileURI); + + // display the new play length + std::ostringstream lengthStr; + lengthStr << std::setfill('0') + << std::setw(2) << playlength->hours() << ":" + << std::setw(2) << playlength->minutes() << ":" + << std::setw(2) << playlength->seconds(); + lengthValueLabel->set_text(lengthStr.str()); + } +} + + +/*------------------------------------------------------------------------------ + * The event when the user has left the file name entry box. + *----------------------------------------------------------------------------*/ +bool +UploadFileWindow :: onFileNameEntryLeave(GdkEventFocus * event) + throw () +{ + updateFileInfo(); + return false; +} + + /*------------------------------------------------------------------------------ * The event when the upload button has been clicked. *----------------------------------------------------------------------------*/ @@ -150,14 +265,32 @@ void UploadFileWindow :: onUploadButtonClicked(void) throw () { try { - Ptr::Ref title; - Ptr::Ref fileName; - Ptr::Ref audioClip; - - title.reset(new Glib::ustring(nameEntry->get_text())); - fileName.reset(new std::string(fileNameEntry->get_text().raw())); - - audioClip = gLiveSupport->uploadFile(title, fileName); + updateFileInfo(); + if (!isFileGood) { + // TODO: localize error message + throw std::invalid_argument("file does not exist"); + } + + Ptr::Ref ustrValue; + + ustrValue.reset(new Glib::ustring(titleEntry->get_text())); + + // create and upload an AudioClip object + Ptr::Ref audioClip(new AudioClip(ustrValue, + playlength, + fileURI)); + + // set the metadata available + ustrValue.reset(new Glib::ustring(creatorEntry->get_text())); + audioClip->setMetadata(ustrValue, "dc:creator"); + ustrValue.reset(new Glib::ustring(genreEntry->get_text())); + audioClip->setMetadata(ustrValue, "dc:type"); + ustrValue.reset(new Glib::ustring( + fileFormatComboBox->get_active_text())); + audioClip->setMetadata(ustrValue, "dc:format"); + + // upload the audio clip + gLiveSupport->uploadFile(audioClip); // display success in the status bar Ptr::Ref uTitle = ustringToUnicodeString( @@ -170,8 +303,10 @@ UploadFileWindow :: onUploadButtonClicked(void) throw () statusBar->set_text(*statusText); // clean the entry fields - nameEntry->set_text(""); - fileNameEntry->set_text(""); + //titleEntry->set_text(""); + //fileNameEntry->set_text(""); + } catch (std::invalid_argument &e) { + statusBar->set_text(e.what()); } catch (XmlRpcException &e) { statusBar->set_text(e.what()); } diff --git a/livesupport/products/gLiveSupport/src/UploadFileWindow.h b/livesupport/products/gLiveSupport/src/UploadFileWindow.h index 43dd8f3ea..bd803e0db 100644 --- a/livesupport/products/gLiveSupport/src/UploadFileWindow.h +++ b/livesupport/products/gLiveSupport/src/UploadFileWindow.h @@ -22,7 +22,7 @@ Author : $Author: maroy $ - Version : $Revision: 1.2 $ + Version : $Revision: 1.3 $ Location : $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/products/gLiveSupport/src/UploadFileWindow.h,v $ ------------------------------------------------------------------------------*/ @@ -43,10 +43,17 @@ #include #include #include +#include +#include #include #include "LiveSupport/Core/Ptr.h" #include "LiveSupport/Core/LocalizedObject.h" +#include "LiveSupport/Widgets/Button.h" +#include "LiveSupport/Widgets/EntryBin.h" +#include "LiveSupport/Widgets/ComboBoxText.h" +#include "LiveSupport/Widgets/Notebook.h" +#include "LiveSupport/Widgets/WhiteWindow.h" #include "GLiveSupport.h" #include "MasterPanelUserInfoWidget.h" @@ -55,6 +62,7 @@ namespace LiveSupport { namespace GLiveSupport { using namespace LiveSupport::Core; +using namespace LiveSupport::Widgets; /* ================================================================ constants */ @@ -79,55 +87,135 @@ using namespace LiveSupport::Core; * * * @author $Author: maroy $ - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ */ -class UploadFileWindow : public Gtk::Window, public LocalizedObject +class UploadFileWindow : public WhiteWindow, public LocalizedObject { protected: /** * The layout used in the window. */ - Ptr::Ref layout; + Gtk::Table * layout; /** * The choose file label */ - Ptr::Ref chooseFileLabel; + Gtk::Label * chooseFileLabel; + + /** + * A container holding the file name entry field. + */ + EntryBin * fileNameEntryBin; /** * The text entry for selecting a file name */ - Ptr::Ref fileNameEntry; + Gtk::Entry * fileNameEntry; /** * The file browser button. */ - Ptr::Ref chooseFileButton; + Button * chooseFileButton; /** - * The name label + * The notepad holding the different sections of metadata. */ - Ptr::Ref nameLabel; + Notebook * metadataNotebook; /** - * The text input for the name. + * The main input section. */ - Ptr::Ref nameEntry; + Gtk::Alignment * mainSection; + + /** + * The layout of the main section. + */ + Gtk::Table * mainLayout; + + /** + * The title label + */ + Gtk::Label * titleLabel; + + /** + * A container holding the title entry field. + */ + EntryBin * titleEntryBin; + + /** + * The text input for the title. + */ + Gtk::Entry * titleEntry; + + /** + * The creator label + */ + Gtk::Label * creatorLabel; + + /** + * A container holding the creator entry field. + */ + EntryBin * creatorEntryBin; + + /** + * The text input for the creator. + */ + Gtk::Entry * creatorEntry; + + /** + * The genre label + */ + Gtk::Label * genreLabel; + + /** + * A container holding the genre entry field. + */ + EntryBin * genreEntryBin; + + /** + * The text input for the genre. + */ + Gtk::Entry * genreEntry; + + /** + * The file format label. + */ + Gtk::Label * fileFormatLabel; + + /** + * The file format combo box. + */ + ComboBoxText * fileFormatComboBox; + + /** + * The length label. + */ + Gtk::Label * lengthLabel; + + /** + * The length value label. + */ + Gtk::Label * lengthValueLabel; + + /** + * The button bar. + */ + Gtk::HBox * buttonBar; /** * The upload button. */ - Ptr::Ref uploadButton; + Gtk::Button * uploadButton; /** * The close button. */ - Ptr::Ref closeButton; + Gtk::Button * closeButton; /** * The status bar. */ - Ptr::Ref statusBar; + Gtk::Label * statusBar; /** * The gLiveSupport object, handling the logic of the application. @@ -139,6 +227,22 @@ class UploadFileWindow : public Gtk::Window, public LocalizedObject */ Ptr::Ref fileName; + /** + * Signals if the file under fileName is good. + */ + bool isFileGood; + + /** + * The URI to the file to upload. + * Basically same as fileName, with 'file://' prepended. + */ + Ptr::Ref fileURI; + + /** + * The playling length of the file to upload. + */ + Ptr::Ref playlength; + /** * Function to catch the event of the choose file button being * pressed. @@ -153,12 +257,29 @@ class UploadFileWindow : public Gtk::Window, public LocalizedObject virtual void onUploadButtonClicked(void) throw (); + /** + * Signal handler for the user leaving the filename entry box, + * where persumably he may have types in a new filename. + * + * @param event the event recieved. + * @return true if the event has been processed, false otherwise. + */ + bool + onFileNameEntryLeave(GdkEventFocus * event) throw (); + /** * Function to catch the event of the close button being pressed. */ virtual void onCloseButtonClicked(void) throw (); + /** + * Update the information for the file to upload, based on the + * value of the fileNameEntry text entry field. + */ + void + updateFileInfo(void) throw (); + public: /** diff --git a/livesupport/products/gLiveSupport/var/hu.txt b/livesupport/products/gLiveSupport/var/hu.txt index 3b145de34..3b93a5ed3 100644 --- a/livesupport/products/gLiveSupport/var/hu.txt +++ b/livesupport/products/gLiveSupport/var/hu.txt @@ -65,11 +65,18 @@ hu:table uploadFileWindow:table { - windowTitle:string { "File Feltőltés Ablak" } + windowTitle:string { "File Feltőltés" } + + chooseFileLabel:string { "Filenév" } + chooseFileButtonLabel:string { "Tallóz" } + + mainSectionLabel:string { "Fő" } + titleLabel:string { "Cim" } + creatorLabel:string { "Szerző" } + genreLabel:string { "Stilus" } + fileFormatLabel:string { "File tipus" } + lengthLabel:string { "Hossz" } - chooseFileLabel:string { "file: " } - chooseFileButtonLabel:string { "tallóz..." } - nameLabel:string { "hang file név: " } uploadButtonLabel:string { "feltölt" } closeButtonLabel:string { "bezár" } statusBar:string { "állapotsor" } diff --git a/livesupport/products/gLiveSupport/var/root.txt b/livesupport/products/gLiveSupport/var/root.txt index a7b86ac08..95f96e311 100644 --- a/livesupport/products/gLiveSupport/var/root.txt +++ b/livesupport/products/gLiveSupport/var/root.txt @@ -65,13 +65,20 @@ root:table uploadFileWindow:table { - windowTitle:string { "Upload File Window" } + windowTitle:string { "Upload File" } - chooseFileLabel:string { "file: " } - chooseFileButtonLabel:string { "browse..." } - nameLabel:string { "audio clip name: " } - uploadButtonLabel:string { "upload" } - closeButtonLabel:string { "close" } + chooseFileLabel:string { "Filename" } + chooseFileButtonLabel:string { "Browse" } + + mainSectionLabel:string { "Main" } + titleLabel:string { "Title" } + creatorLabel:string { "Creator" } + genreLabel:string { "Genre" } + fileFormatLabel:string { "File Type" } + lengthLabel:string { "Duration" } + + uploadButtonLabel:string { "Upload" } + closeButtonLabel:string { "Cancel" } statusBar:string { "status bar" } fileChooserDialogTitle:string { "Choose a File" }