/*
* UserInterface.java
*
* Copyright (C) 2008 Gimme
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
package net.sf.gimme;
import net.sf.gimme.event.DownloadSizeChanged;
import net.sf.gimme.event.EventListener;
import net.sf.gimme.event.GUIEventListener;
import net.sf.gimme.event.GUIEventPipe;
import net.sf.gimme.event.Mediator;
import java.io.FileNotFoundException;
import net.sf.gimme.event.DownloadStatusChanged;
import org.gnome.gdk.Event;
import org.gnome.glade.Glade;
import org.gnome.glade.XML;
import org.gnome.gtk.CellRendererText;
import org.gnome.gtk.DataColumn;
import org.gnome.gtk.DataColumnReference;
import org.gnome.gtk.DataColumnString;
import org.gnome.gtk.Gtk;
import org.gnome.gtk.ImageMenuItem;
import org.gnome.gtk.ListStore;
import org.gnome.gtk.SelectionMode;
import org.gnome.gtk.ToolButton;
import org.gnome.gtk.TreeIter;
import org.gnome.gtk.TreePath;
import org.gnome.gtk.TreeView;
import org.gnome.gtk.TreeViewColumn;
import org.gnome.gtk.Widget;
import org.gnome.gtk.Window;
/**
*
* @author aiden
*/
public class UserInterface implements DownloadManager, GUIEventListener, EventListener
{
final DataColumnReference download = new DataColumnReference();
final DataColumnString name = new DataColumnString();
final DataColumnString progress = new DataColumnString();
final DataColumnString size = new DataColumnString();
final DataColumnString totalsize = new DataColumnString();
final DataColumnString speed = new DataColumnString();
final DataColumnString status = new DataColumnString();
final DataColumn[] types = new DataColumn[]
{
download,
name,
progress,
size,
totalsize,
speed,
status
};
final ListStore model = new ListStore(types);
private Configuration conf;
public final String GLADE_PATH = "res/gimme.glade";
private XML mainGlade;
public UserInterface(Configuration conf)
{
this.conf = conf;
try
{
mainGlade = Glade.parse(GLADE_PATH, "wnd_main");
initTreeView((TreeView)mainGlade.getWidget("treeview"));
final ToolButton addt = (ToolButton)mainGlade.getWidget("tbtn_add");
addt.connect((ToolButton.CLICKED)new GUIEventPipe(this, "add"));
final ImageMenuItem addm = (ImageMenuItem)mainGlade.getWidget("mbtn_add");
addm.connect(new GUIEventPipe(this, "add"));
final ToolButton removet = (ToolButton)mainGlade.getWidget("tbtn_remove");
removet.connect((ToolButton.CLICKED)new GUIEventPipe(this, "remove"));
final ToolButton pauset = (ToolButton)mainGlade.getWidget("tbtn_pause");
pauset.connect((ToolButton.CLICKED)new GUIEventPipe(this, "pause"));
final ToolButton resumet = (ToolButton)mainGlade.getWidget("tbtn_resume");
resumet.connect((ToolButton.CLICKED)new GUIEventPipe(this, "resume"));
final ImageMenuItem preferencesm = (ImageMenuItem)mainGlade.getWidget("mbtn_preferences");
preferencesm.connect(new GUIEventPipe(this, "preferences"));
final Window w = (Window)mainGlade.getWidget("wnd_main");
w.showAll();
w.connect(new Window.DELETE_EVENT()
{
public boolean onDeleteEvent(Widget source, Event event)
{
Gtk.mainQuit();
return false;
}
});
Mediator.register(this);
for(Download d : conf.getCurrentDownloads())
{
addDownload(d);
}
}
catch(FileNotFoundException ex)
{
System.err.println("Can't find the Glade GUI file. Exiting...");
System.exit(1);
}
}
private void initTreeView(TreeView tree)
{
tree.getSelection().setMode(SelectionMode.MULTIPLE);
final TreeViewColumn nameCol = tree.appendColumn();
nameCol.setResizable(true);
nameCol.setTitle("Name");
final CellRendererText nameText = new CellRendererText(nameCol);
nameText.setText(name);
final TreeViewColumn progressCol = tree.appendColumn();
progressCol.setResizable(true);
progressCol.setTitle("Progress");
final CellRendererText progressText = new CellRendererText(progressCol);
progressText.setText(progress);
final TreeViewColumn sizeCol = tree.appendColumn();
sizeCol.setResizable(true);
sizeCol.setTitle("Size");
final CellRendererText sizeText = new CellRendererText(sizeCol);
sizeText.setText(size);
final TreeViewColumn totalsizeCol = tree.appendColumn();
totalsizeCol.setResizable(true);
totalsizeCol.setTitle("Total Size");
final CellRendererText totalsizeText = new CellRendererText(totalsizeCol);
totalsizeText.setText(totalsize);
final TreeViewColumn speedCol = tree.appendColumn();
speedCol.setResizable(true);
speedCol.setTitle("Speed");
final CellRendererText speedText = new CellRendererText(speedCol);
speedText.setText(speed);
final TreeViewColumn statusCol = tree.appendColumn();
statusCol.setResizable(true);
statusCol.setTitle("Status");
final CellRendererText statusText = new CellRendererText(statusCol);
statusText.setText(status);
tree.setModel(model);
}
public void addDownload(Download tDownload)
{
TreeIter row = model.appendRow();
model.setValue(row, download, tDownload);
model.setValue(row, name, tDownload.getName());
double percent = (float)tDownload.getSize() / (float)tDownload.getTotalSize() * 100;
long pct = Math.round(percent);
if(pct == 100 && tDownload.getSize() != tDownload.getTotalSize())
pct = 99;
model.setValue(row, progress, pct + "%");
model.setValue(row, size, tDownload.getSize() + "B");
model.setValue(row, totalsize, tDownload.getTotalSize() + "B");
model.setValue(row, speed, "0 KB/s");
model.setValue(row, status, tDownload.getStatus());
((TreeView)mainGlade.getWidget("treeview")).getSelection().selectRow(row);
}
public void notify(net.sf.gimme.event.Event event)
{
if(event instanceof DownloadSizeChanged)
{
Download d = ((DownloadSizeChanged)event).getDownload();
TreeIter row = model.getIterFirst();
if(row != null)
{
do
{
if(model.getValue(row, download) == d)
{
model.setValue(row, size, d.getSize() + "B");
double percent = (float)d.getSize() / (float)d.getTotalSize() * 100;
model.setValue(row, progress, Math.round(percent) + "%");
model.setValue(row, speed, d.getSpeed()/1024f + " KB/s");
}
}
while(row.iterNext());
}
}
else if(event instanceof DownloadStatusChanged)
{
Download d = ((DownloadStatusChanged)event).getDownload();
TreeIter row = model.getIterFirst();
if(row != null)
{
do
{
if(model.getValue(row, download) == d)
{
model.setValue(row, speed, "");
model.setValue(row, status, d.getStatus());
}
}
while(row.iterNext());
}
}
}
public void onClicked(Widget widget, String userData)
{
if(userData.equals("add"))
{
try
{
new AddDialogHandler(Glade.parse(GLADE_PATH, "wnd_add"), this);
}
catch(FileNotFoundException ex)
{
ex.printStackTrace();
}
}
else if(userData.equals("remove"))
{
TreeView tree = (TreeView)mainGlade.getWidget("treeview");
TreePath[] rows = tree.getSelection().getSelectedRows();
for(TreePath tp : rows)
{
TreeIter row = model.getIter(tp);
Download d = (Download)model.getValue(row, download);
d.removeTempFolder();
model.removeRow(row);
}
}
else if(userData.equals("pause"))
{
TreeView tree = (TreeView)mainGlade.getWidget("treeview");
TreePath[] rows = tree.getSelection().getSelectedRows();
for(TreePath tp : rows)
{
TreeIter row = model.getIter(tp);
Download d = (Download)model.getValue(row, download);
d.pause();
}
}
else if(userData.equals("resume"))
{
TreeView tree = (TreeView)mainGlade.getWidget("treeview");
TreePath[] rows = tree.getSelection().getSelectedRows();
for(TreePath tp : rows)
{
TreeIter row = model.getIter(tp);
Download d = (Download)model.getValue(row, download);
d.resume();
}
}
else if(userData.equals("preferences"))
{
try
{
new PreferencesDialogHandler(Glade.parse(GLADE_PATH, "wnd_preferences"));
}
catch(FileNotFoundException ex)
{
ex.printStackTrace();
}
}
}
}