// Path: src/main/java/songo/TableUtil.java
// public class TableUtil {
// 	public static void packColumns(Table table) {
// 		for(TableColumn column : table.getColumns())
// 			column.pack();
// 	}
// }
// 
// Path: src/main/java/songo/model/Playlist.java
// @SessionScoped
// public class Playlist {
// 	private List<Audio> tracks = ImmutableList.of();
// 	private int currentTrackIndex = -1;
// 	private final EventBus bus;
// 
// 	public List<Audio> getTracks() {
// 		return tracks;
// 	}
// 
// 	public void setTracks(List<Audio> tracks) {
// 		Audio track = getCurrentTrack();
// 		this.tracks = tracks;
// 		fixCurrentTrack(track);
// 		changed();
// 	}
// 
// 	private void fixCurrentTrack(Audio track) {
// 		currentTrackIndex = -1;
// 		int i = 0;
// 		for(Audio t : tracks) {
// 			if(t == track) {
// 				currentTrackIndex = i;
// 				return;
// 			}
// 			i++;
// 		}
// 	}
// 
// 	public Audio getCurrentTrack() {
// 		if(currentTrackIndex == -1)
// 			return null;
// 		return tracks.get(currentTrackIndex);
// 	}
// 
// 	public int getCurrentTrackIndex() {
// 		return currentTrackIndex;
// 	}
// 
// 	public void setCurrentTrackIndex(int currentTrackIndex) {
// 		this.currentTrackIndex = currentTrackIndex;
// 		changed();
// 	}
// 
// 	@Inject
// 	Playlist(@GlobalBus EventBus bus) {
// 		this.bus = bus;
// 	}
// 
// 	public void add(List<Audio> newTracks) {
// 		tracks = new ImmutableList.Builder<Audio>().addAll(tracks).addAll(newTracks).build();
// 		changed();
// 	}
// 
// 	public void replace(List<Audio> selectedTracks) {
// 		tracks = selectedTracks;
// 		currentTrackIndex = -1;
// 		changed();
// 	}
// 
// 	public void remove(int[] indices) {
// 		Audio current = getCurrentTrack();
// 		ArrayList<Audio> view = Lists.newArrayList(tracks);
// 		for(int i = indices.length - 1; i >= 0; i--)
// 			view.remove(indices[i]);
// 		tracks = ImmutableList.copyOf(view);
// 		fixCurrentTrack(current);
// 		changed();
// 	}
// 
// 	private void changed() {
// 		bus.post(new Changed());
// 	}
// 
// 	public static class Changed {
// 		private Changed() { }
// 	}
// }
// 
// Path: src/main/java/songo/vk/Audio.java
// public class Audio {
// 	public final String artist;
// 	public final String title;
// 	public final String url;
// 	public final int duration;
// 
// 	Audio(String artist, String title, String url, int duration) {
// 		this.artist = artist;
// 		this.title = title;
// 		this.url = url;
// 		this.duration = duration;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return Objects.hashCode(artist, title);
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if(obj == null)
// 			return false;
// 		if(this == obj)
// 			return true;
// 		if(!(obj instanceof Audio))
// 			return false;
// 		Audio a = (Audio) obj;
// 		return artist.equals(a.artist) && title.equals(a.title);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return Objects.toStringHelper(this)
// 			.add("artist", artist)
// 			.add("title", title)
// 			.add("url", url)
// 			.toString();
// 	}
// }


import com.google.common.eventbus.EventBus;
import com.google.inject.Inject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import songo.TableUtil;
import songo.annotation.GlobalBus;
import songo.annotation.PlaylistTab;
import songo.annotation.SessionBus;
import songo.model.Playlist;
import songo.vk.Audio;
					delete();
			}
		});
		DragSource dragSource = new DragSource(table, DND.DROP_MOVE);
		dragSource.setTransfer(new Transfer[]{TextTransfer.getInstance()});
		dragSource.addDragListener(new DragSourceAdapter() {
			@Override
			public void dragSetData(DragSourceEvent event) {
				event.data = "track";
			}
		});
		final DropTarget dropTarget = new DropTarget(table, DND.DROP_MOVE);
		dropTarget.setTransfer(new Transfer[]{TextTransfer.getInstance()});
		dropTarget.addDropListener(new DropTargetAdapter() {
			@Override
			public void dragEnter(DropTargetEvent event) {
				for(TransferData t : event.dataTypes)
					if(TextTransfer.getInstance().isSupportedType(t))
						event.currentDataType = t;
			}

			@Override
			public void dragOver(DropTargetEvent event) {
				event.feedback = DND.FEEDBACK_INSERT_BEFORE | DND.FEEDBACK_SCROLL;
			}

			@Override
			public void drop(DropTargetEvent event) {
				if(event.item == null)
					return;
// Path: src/main/java/songo/TableUtil.java
// public class TableUtil {
// 	public static void packColumns(Table table) {
// 		for(TableColumn column : table.getColumns())
// 			column.pack();
// 	}
// }
// 
// Path: src/main/java/songo/model/Playlist.java
// @SessionScoped
// public class Playlist {
// 	private List<Audio> tracks = ImmutableList.of();
// 	private int currentTrackIndex = -1;
// 	private final EventBus bus;
// 
// 	public List<Audio> getTracks() {
// 		return tracks;
// 	}
// 
// 	public void setTracks(List<Audio> tracks) {
// 		Audio track = getCurrentTrack();
// 		this.tracks = tracks;
// 		fixCurrentTrack(track);
// 		changed();
// 	}
// 
// 	private void fixCurrentTrack(Audio track) {
// 		currentTrackIndex = -1;
// 		int i = 0;
// 		for(Audio t : tracks) {
// 			if(t == track) {
// 				currentTrackIndex = i;
// 				return;
// 			}
// 			i++;
// 		}
// 	}
// 
// 	public Audio getCurrentTrack() {
// 		if(currentTrackIndex == -1)
// 			return null;
// 		return tracks.get(currentTrackIndex);
// 	}
// 
// 	public int getCurrentTrackIndex() {
// 		return currentTrackIndex;
// 	}
// 
// 	public void setCurrentTrackIndex(int currentTrackIndex) {
// 		this.currentTrackIndex = currentTrackIndex;
// 		changed();
// 	}
// 
// 	@Inject
// 	Playlist(@GlobalBus EventBus bus) {
// 		this.bus = bus;
// 	}
// 
// 	public void add(List<Audio> newTracks) {
// 		tracks = new ImmutableList.Builder<Audio>().addAll(tracks).addAll(newTracks).build();
// 		changed();
// 	}
// 
// 	public void replace(List<Audio> selectedTracks) {
// 		tracks = selectedTracks;
// 		currentTrackIndex = -1;
// 		changed();
// 	}
// 
// 	public void remove(int[] indices) {
// 		Audio current = getCurrentTrack();
// 		ArrayList<Audio> view = Lists.newArrayList(tracks);
// 		for(int i = indices.length - 1; i >= 0; i--)
// 			view.remove(indices[i]);
// 		tracks = ImmutableList.copyOf(view);
// 		fixCurrentTrack(current);
// 		changed();
// 	}
// 
// 	private void changed() {
// 		bus.post(new Changed());
// 	}
// 
// 	public static class Changed {
// 		private Changed() { }
// 	}
// }
// 
// Path: src/main/java/songo/vk/Audio.java
// public class Audio {
// 	public final String artist;
// 	public final String title;
// 	public final String url;
// 	public final int duration;
// 
// 	Audio(String artist, String title, String url, int duration) {
// 		this.artist = artist;
// 		this.title = title;
// 		this.url = url;
// 		this.duration = duration;
// 	}
// 
// 	@Override
// 	public int hashCode() {
// 		return Objects.hashCode(artist, title);
// 	}
// 
// 	@Override
// 	public boolean equals(Object obj) {
// 		if(obj == null)
// 			return false;
// 		if(this == obj)
// 			return true;
// 		if(!(obj instanceof Audio))
// 			return false;
// 		Audio a = (Audio) obj;
// 		return artist.equals(a.artist) && title.equals(a.title);
// 	}
// 
// 	@Override
// 	public String toString() {
// 		return Objects.toStringHelper(this)
// 			.add("artist", artist)
// 			.add("title", title)
// 			.add("url", url)
// 			.toString();
// 	}
// }


// Path: src/main/java/songo/view/PlaylistView.java
import com.google.common.eventbus.EventBus;
import com.google.inject.Inject;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.*;
import org.eclipse.swt.events.*;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;
import songo.TableUtil;
import songo.annotation.GlobalBus;
import songo.annotation.PlaylistTab;
import songo.annotation.SessionBus;
import songo.model.Playlist;
import songo.vk.Audio;

					delete();
			}
		});
		DragSource dragSource = new DragSource(table, DND.DROP_MOVE);
		dragSource.setTransfer(new Transfer[]{TextTransfer.getInstance()});
		dragSource.addDragListener(new DragSourceAdapter() {
			@Override
			public void dragSetData(DragSourceEvent event) {
				event.data = "track";
			}
		});
		final DropTarget dropTarget = new DropTarget(table, DND.DROP_MOVE);
		dropTarget.setTransfer(new Transfer[]{TextTransfer.getInstance()});
		dropTarget.addDropListener(new DropTargetAdapter() {
			@Override
			public void dragEnter(DropTargetEvent event) {
				for(TransferData t : event.dataTypes)
					if(TextTransfer.getInstance().isSupportedType(t))
						event.currentDataType = t;
			}

			@Override
			public void dragOver(DropTargetEvent event) {
				event.feedback = DND.FEEDBACK_INSERT_BEFORE | DND.FEEDBACK_SCROLL;
			}

			@Override
			public void drop(DropTargetEvent event) {
				if(event.item == null)
					return;
				Audio track = (Audio) event.item.getData("track");