/*************************************************************************** * Copyright (C) by Fabrizio Montesi * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as * * published by the Free Software Foundation; either version 2 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * * For details about the authors of this software, see the AUTHORS file. * ***************************************************************************/ package com.italianasoftware.echoes.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.WindowCloseListener; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.ChangeListener; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.DialogBox; import com.google.gwt.user.client.ui.DisclosurePanel; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Image; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ListBox; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import joliex.gwt.client.JolieService; import joliex.gwt.client.Value; public class Echoes implements EntryPoint { private TextBox location = new TextBox(); private Label cpLabel = new Label(); private Value getLocationValue() { Value ret = new Value(); ret.getNewChild( "location" ).setValue( location.getText() ); return ret; } private void showLyrics() { Value val = getLocationValue(); lyrics.setText( "Fetching lyrics..." ); lyricsDialog.center(); lyricsDialog.show(); JolieService.Util.getInstance().call( "getLyrics", val, new EchoesCallback() { @Override public void onSuccess( Value response ) { lyrics.setHTML( response.strValue().replace( "\n", "<br/>" ) ); lyricsDialog.center(); } } ); } private void waitForStateChange() { Value val = getLocationValue(); val.getFirstChild( "logicalClock" ).setValue( logicalClock ); JolieService.Util.getInstance().call( "waitForStateChange", val, new EchoesCallback() { @Override public void onSuccess( Value response ) { setWidgetValues( response ); logicalClock = response.getFirstChild( "logicalClock" ).intValue(); waitForStateChange(); } } ); } private int sid = -1; private void startClientSession() { Value val = getLocationValue(); JolieService.Util.getInstance().call( "startClientSession", val, new EchoesCallback() { @Override public void onSuccess( Value response ) { setWidgetValues( response ); sid = response.getFirstChild( "sid" ).intValue(); logicalClock = response.getFirstChild( "logicalClock" ).intValue(); Window.addWindowCloseListener( new WindowCloseListener() { public String onWindowClosing() { return null; } public void onWindowClosed() { closeClientSession(); } } ); } } ); } private int logicalClock = 0; private void setWidgetValues( Value state ) { state = state.getFirstChild( "state" ); playlistBox.clear(); for( Value v : state.getFirstChild( "playlist" ).getChildren( "song" ) ) { playlistBox.addItem( v.strValue() ); } cpLabel.setText( state.getFirstChild( "nowPlaying" ).strValue() ); int volume = state.getFirstChild( "volume" ).intValue(); volumeMenu.setSelectedIndex( (volume + 4) / 5 ); } private void createLyricsDialog() { lyricsDialog = new DialogBox(); VerticalPanel vPanel = new VerticalPanel(); vPanel.setHeight( "100%" ); vPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); vPanel.setVerticalAlignment( VerticalPanel.ALIGN_MIDDLE ); lyricsDialog.add( vPanel ); lyrics = new HTML(); ScrollPanel scrollPanel = new ScrollPanel(); scrollPanel.setWidth( "300px" ); scrollPanel.setHeight( "250px" ); scrollPanel.add( lyrics ); vPanel.add( scrollPanel ); Button close = new NativeButton( "Close" ); close.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { lyricsDialog.hide(); } } ); vPanel.add( close ); } private void playSongByIndex( int index ) { Value val = getLocationValue(); val.getNewChild( "index" ).setValue( index ); JolieService.Util.getInstance().call( "playByIndex", val, new EchoesCallback() { @Override public void onSuccess( Value response ) { } } ); } private void setVolume( String volume ) { Value val = getLocationValue(); val.setValue( volume ); JolieService.Util.getInstance().call( "setVolume", val, new EchoesCallback() { @Override public void onSuccess( Value response ) { } } ); } private void createAboutDialog() { aboutDialog = new DialogBox(); VerticalPanel vPanel = new VerticalPanel(); vPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); aboutDialog.add( vPanel ); vPanel.add( new HTML( "<strong>Echoes</strong>" ) ); VerticalPanel cPanel = new VerticalPanel(); vPanel.add( cPanel ); cPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); cPanel.addStyleName( "margintop-2em" ); cPanel.add( new HTML( "(C) 2008, <a href=\"mailto:fmontesi@italianasoftware.com\">Fabrizio Montesi</a>" ) ); HTML oxygenTeam = new HTML( "Echoes logo by <a href=\"http://www.oxygen-icons.org/\" target=\"_new\">the Oxygen team</a>" ); oxygenTeam.addStyleName( "margintop-1em" ); cPanel.add( oxygenTeam ); HTML license = new HTML( "License: <a href=\"http://www.gnu.org/licenses/old-licenses/gpl-2.0.html\" target=\"_new\">GPLv2</a>" ); license.addStyleName( "margintop-1em" ); cPanel.add( license ); HorizontalPanel hPanel = new HorizontalPanel(); hPanel.setVerticalAlignment( HorizontalPanel.ALIGN_MIDDLE ); hPanel.addStyleName( "margintop-1em" ); HTML poweredBy = new HTML( "Powered by: " ); hPanel.add( poweredBy ); Image jolieImage = new Image( "images/jolie.png" ); jolieImage.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { Window.open( "http://jolie.sourceforge.net/", "_blank", "" ); } } ); hPanel.add( jolieImage ); cPanel.add( hPanel ); Button closeButton = new NativeButton( "Close" ); closeButton.addStyleName( "margintop-1em" ); closeButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { aboutDialog.hide(); } } ); vPanel.add( closeButton ); } private DialogBox lyricsDialog; private HTML lyrics; private ListBox playlistBox; private ListBox volumeMenu; private DialogBox aboutDialog; private final static String logoURL = "images/logo.png"; public void onModuleLoad() { createLyricsDialog(); Image.prefetch( logoURL ); location.setText( "socket://localhost:10100" ); VerticalPanel mainVPanel = new VerticalPanel(); mainVPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); RootPanel.get().add( mainVPanel ); HorizontalPanel hPanel; hPanel = new HorizontalPanel(); mainVPanel.add( hPanel ); VerticalPanel vPanel = new VerticalPanel(); hPanel.add( vPanel ); VerticalPanel playlistVPanel = new VerticalPanel(); playlistVPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); playlistVPanel.setVerticalAlignment( VerticalPanel.ALIGN_MIDDLE ); hPanel.add( playlistVPanel ); vPanel.setHorizontalAlignment( VerticalPanel.ALIGN_CENTER ); vPanel.setVerticalAlignment( VerticalPanel.ALIGN_MIDDLE ); Image logo = new Image( logoURL ); createAboutDialog(); logo.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { aboutDialog.center(); aboutDialog.show(); } } ); vPanel.add( logo ); vPanel.addStyleName( "panel-rightborder" ); //hPanel = new HorizontalPanel(); DisclosurePanel dPanel = new DisclosurePanel( "Location", false ); VerticalPanel locVPanel = new VerticalPanel(); locVPanel.setHorizontalAlignment( HorizontalPanel.ALIGN_CENTER ); locVPanel.add( location ); final Button connectButton = new NativeButton( "Connect" ); connectButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { startClientSession(); waitForStateChange(); connectButton.setText( "Connected" ); connectButton.setEnabled( false ); } } ); dPanel.add( locVPanel ); //hPanel.add( dPanel ); vPanel.add( dPanel ); vPanel.add( connectButton ); //hPanel = new HorizontalPanel(); Label l = new Label( "Currently playing" ); l.addStyleName( "label-bold" ); mainVPanel.add( l ); mainVPanel.add( cpLabel ); //mainvPanel.add( hPanel ); HorizontalPanel buttonsPanel = new HorizontalPanel(); mainVPanel.add( buttonsPanel ); Button playButton = new NativeButton( "Play" ); playButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { JolieService.Util.getInstance().call( "play", getLocationValue(), new EchoesCallback() { @Override public void onSuccess( Value response ) { //updateNowPlaying(); } } ); } } ); Button pauseButton = new NativeButton( "Pause" ); pauseButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { JolieService.Util.getInstance().call( "pause", getLocationValue(), new EchoesCallback() { @Override public void onSuccess( Value response ) {} } ); } } ); Button prevButton = new NativeButton( "<" ); prevButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { JolieService.Util.getInstance().call( "previous", getLocationValue(), new EchoesCallback() { @Override public void onSuccess( Value response ) { //updateNowPlaying(); } } ); } } ); Button nextButton = new NativeButton( ">" ); nextButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { JolieService.Util.getInstance().call( "next", getLocationValue(), new EchoesCallback() { @Override public void onSuccess( Value response ) { //updateNowPlaying(); } } ); } } ); buttonsPanel.add( prevButton ); buttonsPanel.add( playButton ); buttonsPanel.add( pauseButton ); buttonsPanel.add( nextButton ); playlistBox = new ListBox(); playlistBox.setVisibleItemCount( 8 ); playlistVPanel.add( playlistBox ); playlistBox.setWidth( "250px" ); playlistBox.addClickListener( new ClickListener() { public void onClick( Widget widget ) { playSongByIndex( playlistBox.getSelectedIndex() ); } } ); hPanel = new HorizontalPanel(); Button showLyricsButton = new NativeButton( "Show lyrics" ); showLyricsButton.addClickListener( new ClickListener() { public void onClick( Widget arg0 ) { showLyrics(); } } ); hPanel.add( showLyricsButton ); playlistVPanel.add( hPanel ); dPanel = new DisclosurePanel( "Volume" ); playlistVPanel.add( dPanel ); volumeMenu = new ListBox(); dPanel.add( volumeMenu ); addVolumeMenuItems( volumeMenu ); volumeMenu.addChangeListener( new ChangeListener() { public void onChange( Widget arg0 ) { String volume = volumeMenu.getValue( volumeMenu.getSelectedIndex() ); setVolume( volume ); } } ); } private void closeClientSession() { final DialogBox dialog = new DialogBox(); dialog.add( new Label( "Exiting..." ) ); dialog.center(); dialog.show(); Value v = getLocationValue(); v.getNewChild( "sid" ).setValue( sid ); JolieService.Util.getInstance().call( "closeClientSession", v, new EchoesCallback() { @Override public void onSuccess( Value response ) { dialog.hide(); } } ); } private void addVolumeMenuItems( ListBox volumeMenu ) { volumeMenu.addItem( "0%", "0" ); volumeMenu.addItem( "5%", "5" ); volumeMenu.addItem( "10%", "10" ); volumeMenu.addItem( "15%", "15" ); volumeMenu.addItem( "20%", "20" ); volumeMenu.addItem( "25%", "25" ); volumeMenu.addItem( "30%", "30" ); volumeMenu.addItem( "35%", "35" ); volumeMenu.addItem( "40%", "40" ); volumeMenu.addItem( "45%", "45" ); volumeMenu.addItem( "50%", "50" ); volumeMenu.addItem( "55%", "55" ); volumeMenu.addItem( "60%", "60" ); volumeMenu.addItem( "65%", "65" ); volumeMenu.addItem( "70%", "70" ); volumeMenu.addItem( "75%", "75" ); volumeMenu.addItem( "80%", "80" ); volumeMenu.addItem( "85%", "85" ); volumeMenu.addItem( "90%", "90" ); volumeMenu.addItem( "95%", "95" ); volumeMenu.addItem( "100%", "100" ); } }