/** * Marabou - Audio Tagger * Copyright (C) 2012 - 2016 Jan-Hendrik Peters * https://github.com/hennr/marabou * Marabou 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/gpl-3.0.html>. */ package com.github.marabou.ui.controller; import com.github.marabou.audio.store.AudioFileSavedEvent; import com.github.marabou.ui.events.FilesSelectedEvent; import com.github.marabou.audio.store.AudioFileAddedEvent; import com.github.marabou.audio.AudioFile; import com.github.marabou.audio.store.AudioFileStore; import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.program.Program; import org.eclipse.swt.widgets.*; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import static com.github.marabou.helper.I18nHelper.i18n; public class TableController { EventBus bus; Table table; private final AudioFileStore audioFileStore; public static final int TABLE_COLUMN_FILE_PATH = 14; public TableController(EventBus bus, Table table, AudioFileStore audioFileStore) { this.bus = bus; bus.register(this); setupTable(table); this.audioFileStore = audioFileStore; } private void setupTable(Table table) { this.table = table; this.table.setLinesVisible(true); this.table.setHeaderVisible(true); setupTableColumns(table); addDoubleClickListener(table); addPressedEnterListener(table); addItemsSelectedListener(table); addRemoveItemsListener(table); } private void setupTableColumns(Table table) { // artist TableColumn artist = new TableColumn(table, SWT.LEFT); artist.setWidth(200); artist.setText(i18n("Artist")); artist.setMoveable(true); // title TableColumn title = new TableColumn(table, SWT.LEFT); title.setWidth(200); title.setText(i18n("Title")); title.setMoveable(true); // album TableColumn album = new TableColumn(table, SWT.LEFT); album.setWidth(200); album.setText(i18n("Album")); album.setMoveable(true); // duration TableColumn length = new TableColumn(table, SWT.LEFT); length.setWidth(60); length.setText(i18n("Length")); length.setMoveable(true); // track number TableColumn track = new TableColumn(table, SWT.LEFT); track.setWidth(60); track.setText(i18n("Track number")); track.setMoveable(true); // bit rate TableColumn bitRate = new TableColumn(table, SWT.LEFT); bitRate.setWidth(60); bitRate.setText(i18n("Bit rate")); bitRate.setMoveable(true); // sample rate TableColumn sampleRate = new TableColumn(table, SWT.LEFT); sampleRate.setWidth(60); sampleRate.setText(i18n("Samplerate")); sampleRate.setMoveable(true); // channels TableColumn channels = new TableColumn(table, SWT.LEFT); channels.setWidth(60); channels.setText(i18n("Channels")); channels.setMoveable(true); // year TableColumn year = new TableColumn(table, SWT.LEFT); year.setWidth(60); year.setText(i18n("Year")); year.setMoveable(true); // genre TableColumn genre = new TableColumn(table, SWT.LEFT); genre.setWidth(120); genre.setText(i18n("Genre")); genre.setMoveable(true); // comments TableColumn comments = new TableColumn(table, SWT.LEFT); comments.setWidth(120); comments.setText(i18n("Comments")); comments.setMoveable(true); // disc number TableColumn diskNumber = new TableColumn(table, SWT.LEFT); diskNumber.setWidth(60); diskNumber.setText(i18n("Disk number")); diskNumber.setMoveable(true); // composer TableColumn composer = new TableColumn(table, SWT.LEFT); composer.setWidth(120); composer.setText(i18n("Composer")); composer.setMoveable(true); // file type TableColumn format = new TableColumn(table, SWT.LEFT); format.setWidth(100); format.setText(i18n("Format")); format.setMoveable(true); // path TableColumn path = new TableColumn(table, SWT.LEFT); path.setWidth(1000); path.setText(i18n("Path")); path.setMoveable(true); } private void addDoubleClickListener(Table table) { table.addListener(SWT.MouseDoubleClick, event -> { int index = table.getSelectionIndex(); if (index != -1) { Program.launch(table.getItem(index).getText(TABLE_COLUMN_FILE_PATH)); } }); } private void addPressedEnterListener(Table table) { table.addTraverseListener(event -> { if (event.detail == SWT.TRAVERSE_RETURN) { int index = table.getSelectionIndex(); if (index != -1) { Program.launch(table.getItem(index).getText(TABLE_COLUMN_FILE_PATH)); } } }); } private void addItemsSelectedListener(Table table) { table.addSelectionListener(new SelectionListener() { @Override public void widgetSelected(SelectionEvent e) { Set<TableItem> selectedItems = Sets.newHashSet(); Arrays.stream(table.getSelectionIndices()).forEach(index -> selectedItems.add(table.getItem(index))); Set<AudioFile> selectedAudioFiles = new HashSet<>(); for (TableItem item : selectedItems) { AudioFile audioFile = audioFileStore.getAudioFileByFilePath(item.getText(TABLE_COLUMN_FILE_PATH)); selectedAudioFiles.add(audioFile); } bus.post(new FilesSelectedEvent(selectedAudioFiles)); } @Override public void widgetDefaultSelected(SelectionEvent e) { } }); } private void addRemoveItemsListener(Table table) { table.addListener(SWT.KeyDown, event -> { if (event.keyCode == SWT.DEL) { Arrays.stream(table.getSelection()).forEach(tableItem -> { AudioFile audioFile = (AudioFile) tableItem.getData(); removeTableItem(audioFile.getFilePath()); audioFileStore.removeAudioFile(audioFile.getFilePath()); }); clearSidePanelEntries(); } }); } private void clearSidePanelEntries() { bus.post(new FilesSelectedEvent(Sets.newHashSet(new AudioFile("")))); } @Subscribe public void addNewFile(AudioFileAddedEvent audioFileAddedEvent) { addTableItem(audioFileAddedEvent.getAudioFile()); table.setFocus(); } @Subscribe public void onAudioFileSavedEvent(AudioFileSavedEvent audioFileSavedEvent) { removeTableItem(audioFileSavedEvent.oldFilePath); AudioFile audioFile = audioFileStore.getAudioFileByFilePath(audioFileSavedEvent.newFilePath); addTableItem(audioFile); correctFocusAndSidePanelAfterSaving(audioFile); } private void correctFocusAndSidePanelAfterSaving(AudioFile audioFile) { table.select(0); table.setFocus(); bus.post(new FilesSelectedEvent(Sets.newHashSet(audioFile))); } private void removeTableItem(String filePath) { Arrays.stream(table.getItems()).forEach(tableItem -> { AudioFile audioFile = (AudioFile) tableItem.getData(); if (audioFile.getFilePath().equals(filePath)) { table.remove(table.indexOf(tableItem)); } }); } private void addTableItem(AudioFile audioFile) { TableItem tableItem = createNewTableItem(audioFile); tableItem.setText(new String[]{ audioFile.getArtist(), audioFile.getTitle(), audioFile.getAlbum(), audioFile.getDuration(), audioFile.getTrack(), audioFile.getBitRate(), audioFile.getSamplerate(), audioFile.getChannels(), audioFile.getYear(), audioFile.getGenre(), audioFile.getComment(), audioFile.getDiscNumber(), audioFile.getComposer(), audioFile.getEncoding(), audioFile.getFilePath()}); } private TableItem createNewTableItem(AudioFile audioFile) { TableItem tableItem = new TableItem(table, SWT.None); tableItem.setData(audioFile); return tableItem; } }