/*
* Jampa
* Copyright (C) 2008-2009 J. Devauchelle and contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* version 3 as published by the Free Software Foundation.
*
* 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.
*/
package org.jampa.gui.views;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jface.dialogs.IMessageProvider;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.Util;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CCombo;
import org.eclipse.swt.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.forms.events.ExpansionAdapter;
import org.eclipse.ui.forms.events.ExpansionEvent;
import org.eclipse.ui.forms.widgets.ExpandableComposite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.eclipse.ui.forms.widgets.Section;
import org.eclipse.ui.part.ViewPart;
import org.jampa.Activator;
import org.jampa.controllers.Controller;
import org.jampa.gui.actions.playlist.NewPlaylistAction;
import org.jampa.gui.runnables.SearchRunnable;
import org.jampa.gui.translations.Messages;
import org.jampa.logging.Log;
import org.jampa.model.disk.FileItem;
import org.jampa.model.disk.IDiskItem;
import org.jampa.model.playlists.AudioItem;
import org.jampa.model.playlists.Playlist;
import org.jampa.preferences.PreferenceConstants;
import org.jampa.utils.Constants;
import org.jampa.utils.Utils;
public class SearchView extends ViewPart {
public static String ID = "Jampa.SearchView"; //$NON-NLS-1$
private Composite _parent;
private FormToolkit toolkit;
private ScrolledForm form;
private Image _searchImage;
private Image _selectAllImage;
private Image _selectNoneImage;
private Image _reverseSelectionImage;
private List<AudioItem> _lastSearch = null;
private Section searchParamSection;
private ExpandableComposite searchScopeExpComposite;
private ExpandableComposite searchOptionsExpComposite;
private ExpandableComposite advancedSearchExpComposite;
private Text searchText;
private Text queryText;
private Label searchTermLabel;
private Button searchInTitle;
private Button searchInArtist;
private Button searchInAlbum;
private Button searchInGenre;
private Button searchInYear;
private Button searchCaseSensitive;
private Button searchWholeWord;
private Button searchButton;
private Button clearSearchButton;
private Table searchResults;
private ToolItem selectAllItem;
private ToolItem selectNoneItem;
private ToolItem reverseSelectionItem;
private Button playSelection;
private Button enqueueSelection;
private CCombo playlistSelection;
private TableViewer viewer;
private boolean _boAllSelected;
private boolean _boSearchHasResults = false;
class ViewContentProvider implements IStructuredContentProvider {
public Object[] getElements(Object inputElement) {
if (_lastSearch != null) {
return _lastSearch.toArray();
} else {
return new ArrayList<AudioItem>().toArray();
}
}
public void dispose() {
}
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
public Image getColumnImage(Object element, int columnIndex) {
return null;
}
public String getColumnText(Object element, int columnIndex) {
String result;
switch (columnIndex) {
case 1 : result = ((AudioItem) element).getPropertiesList().get(AudioItem.TITLE); break;
case 2 : result = ((AudioItem) element).getPropertiesList().get(AudioItem.ARTIST); break;
case 3 : result = ((AudioItem) element).getPropertiesList().get(AudioItem.ALBUM); break;
case 4 : result = ((AudioItem) element).getPropertiesList().get(AudioItem.GENRE); break;
case 5 : result = Utils.seconds2String(((AudioItem) element).getTrackLength()); break;
case 6 : result = ((AudioItem) element).getPropertiesList().get(AudioItem.YEAR); break;
default : result = ""; //$NON-NLS-1$
}
return result;
}
}
public SearchView() {
Activator.getDefault();
ImageDescriptor imageDescriptor = Activator.getImageDescriptor("/icons/search_16.png"); //$NON-NLS-1$
_searchImage = imageDescriptor.createImage();
imageDescriptor = Activator.getImageDescriptor("/icons/selectall_16.png"); //$NON-NLS-1$
_selectAllImage = imageDescriptor.createImage();
imageDescriptor = Activator.getImageDescriptor("/icons/selectnone_16.png"); //$NON-NLS-1$
_selectNoneImage = imageDescriptor.createImage();
imageDescriptor = Activator.getImageDescriptor("/icons/reverseselection_16.png"); //$NON-NLS-1$
_reverseSelectionImage = imageDescriptor.createImage();
}
@Override
public void createPartControl(Composite parent) {
_parent = parent;
setPartName(Messages.getString("SearchView.Title")); //$NON-NLS-1$
toolkit = new FormToolkit(parent.getDisplay());
form = toolkit.createScrolledForm(parent);
form.setText(Messages.getString("SearchView.FormTitle")); //$NON-NLS-1$
toolkit.decorateFormHeading(form.getForm());
form.setImage(_searchImage);
GridLayout layout = new GridLayout(1, true);
form.getBody().setLayout(layout);
// Search parameters section
searchParamSection = toolkit.createSection(form.getBody(),
Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
searchParamSection.setText(Messages.getString("SearchView.SearchParametersSectionTitle")); //$NON-NLS-1$
GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
searchParamSection.setLayoutData(gd);
searchParamSection.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
reflowDisplay();
}
});
Composite searchParamClient = toolkit.createComposite(searchParamSection);
searchParamClient.setLayout(new GridLayout(4, false));
searchTermLabel = toolkit.createLabel(searchParamClient, Messages.getString("SearchView.SearchTermLabel")); //$NON-NLS-1$
searchText = toolkit.createText(searchParamClient, ""); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 3;
searchText.setLayoutData(gd);
searchText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.CR) {
doSearch();
}
}
});
searchScopeExpComposite = toolkit.createExpandableComposite(searchParamClient,
ExpandableComposite.TREE_NODE|
ExpandableComposite.CLIENT_INDENT);
searchScopeExpComposite.setText(Messages.getString("SearchView.SearchScope")); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 4;
searchScopeExpComposite.setLayoutData(gd);
Composite searchScopeComposite = toolkit.createComposite(searchScopeExpComposite);
searchScopeComposite.setLayout(new GridLayout(5, false));
searchInTitle = toolkit.createButton(searchScopeComposite, Messages.getString("SearchView.SearchInTitleCheck"), SWT.CHECK); //$NON-NLS-1$
searchInArtist = toolkit.createButton(searchScopeComposite, Messages.getString("SearchView.SearchInArtistCheck"), SWT.CHECK); //$NON-NLS-1$
searchInAlbum = toolkit.createButton(searchScopeComposite, Messages.getString("SearchView.SearchInAlbumCheck"), SWT.CHECK); //$NON-NLS-1$
searchInGenre = toolkit.createButton(searchScopeComposite, Messages.getString("SearchView.SearchInGenreCheck"), SWT.CHECK); //$NON-NLS-1$
searchInYear = toolkit.createButton(searchScopeComposite, Messages.getString("SearchView.SearchInYearCheck"), SWT.CHECK); //$NON-NLS-1$
toolkit.paintBordersFor(searchScopeComposite);
searchScopeExpComposite.setClient(searchScopeComposite);
searchScopeExpComposite.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
reflowDisplay();
}
});
searchOptionsExpComposite = toolkit.createExpandableComposite(searchParamClient,
ExpandableComposite.TREE_NODE|
ExpandableComposite.CLIENT_INDENT);
searchOptionsExpComposite.setText(Messages.getString("SearchView.SearchOptions")); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 4;
searchOptionsExpComposite.setLayoutData(gd);
Composite searchOptionsComposite = toolkit.createComposite(searchOptionsExpComposite);
searchOptionsComposite.setLayout(new GridLayout(2, false));
searchCaseSensitive = toolkit.createButton(searchOptionsComposite, Messages.getString("SearchView.SearchCaseSensitive"), SWT.CHECK); //$NON-NLS-1$
searchWholeWord = toolkit.createButton(searchOptionsComposite, Messages.getString("SearchView.SearchWholeWord"), SWT.CHECK); //$NON-NLS-1$
toolkit.paintBordersFor(searchOptionsComposite);
searchOptionsExpComposite.setClient(searchOptionsComposite);
searchOptionsExpComposite.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
reflowDisplay();
}
});
advancedSearchExpComposite = toolkit.createExpandableComposite(searchParamClient,
ExpandableComposite.TREE_NODE|
ExpandableComposite.CLIENT_INDENT);
advancedSearchExpComposite.setText(Messages.getString("SearchView.AdvancedSearchTitle")); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 4;
advancedSearchExpComposite.setLayoutData(gd);
Composite advancedSearchComposite = toolkit.createComposite(advancedSearchExpComposite);
advancedSearchComposite.setLayout(new GridLayout(2, false));
toolkit.createLabel(advancedSearchComposite, Messages.getString("SearchView.AdvancedSearchQueryLabel")); //$NON-NLS-1$
queryText = toolkit.createText(advancedSearchComposite, ""); //$NON-NLS-1$
queryText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
queryText.addKeyListener(new KeyAdapter() {
public void keyPressed(KeyEvent e) {
if (e.keyCode == SWT.CR) {
doSearch();
}
}
});
toolkit.paintBordersFor(advancedSearchComposite);
advancedSearchExpComposite.setClient(advancedSearchComposite);
UpdateEnableState(true);
advancedSearchExpComposite.addExpansionListener(new ExpansionAdapter() {
public void expansionStateChanged(ExpansionEvent e) {
UpdateEnableState(!advancedSearchExpComposite.isExpanded());
reflowDisplay();
}
});
Composite searchButtonsComposite = toolkit.createComposite(searchParamClient);
gd = new GridData(SWT.FILL, SWT.NONE, true, false);
gd.horizontalSpan = 4;
searchButtonsComposite.setLayoutData(gd);
searchButtonsComposite.setLayout(new GridLayout(2, false));
searchButton = toolkit.createButton(searchButtonsComposite, Messages.getString("SearchView.DoSearch"), SWT.PUSH); //$NON-NLS-1$
searchButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent arg0) {
doSearch();
}
});
clearSearchButton = toolkit.createButton(searchButtonsComposite, Messages.getString("SearchView.ClearSearchResults"), SWT.PUSH); //$NON-NLS-1$
clearSearchButton.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent arg0) {
clearSearchResults();
}
});
toolkit.paintBordersFor(searchParamClient);
searchParamSection.setClient(searchParamClient);
// Search results section
Section searchResultsSection = toolkit.createSection(form.getBody(),
Section.TITLE_BAR | Section.EXPANDED);
searchResultsSection.setText(Messages.getString("SearchView.SearchResultsSectionTitle")); //$NON-NLS-1$
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
searchResultsSection.setLayoutData(gd);
ToolBar searchResultsSectionToolBar = new ToolBar(searchResultsSection, SWT.FLAT | SWT.HORIZONTAL);
selectAllItem = new ToolItem(searchResultsSectionToolBar, SWT.NULL);
selectAllItem.setImage(_selectAllImage);
selectAllItem.setToolTipText(Messages.getString("SearchView.ResultsSelectAll")); //$NON-NLS-1$
selectAllItem.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
setAllCheckedStatus(true);
}
});
selectNoneItem = new ToolItem(searchResultsSectionToolBar, SWT.NULL);
selectNoneItem.setImage(_selectNoneImage);
selectNoneItem.setToolTipText(Messages.getString("SearchView.ResultsSelectNone")); //$NON-NLS-1$
selectNoneItem.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
setAllCheckedStatus(false);
}
});
reverseSelectionItem = new ToolItem(searchResultsSectionToolBar, SWT.NULL);
reverseSelectionItem.setImage(_reverseSelectionImage);
reverseSelectionItem.setToolTipText(Messages.getString("SearchView.ResultsReverseSelection")); //$NON-NLS-1$
reverseSelectionItem.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
reverseCheckedStatus();
}
});
searchResultsSection.setTextClient(searchResultsSectionToolBar);
Composite searchResultClient = toolkit.createComposite(searchResultsSection);
searchResultClient.setLayout(new GridLayout(1, false));
Composite actionSelectionComposite = toolkit.createComposite(searchResultClient);
actionSelectionComposite.setLayoutData(new GridData(SWT.NONE, SWT.NONE, false, false));
actionSelectionComposite.setLayout(new GridLayout(3, false));
playlistSelection = new CCombo(actionSelectionComposite, SWT.BORDER | SWT.FLAT | SWT.DROP_DOWN | SWT.READ_ONLY);
playSelection = toolkit.createButton(actionSelectionComposite, Messages.getString("SearchView.PlayResults"), SWT.PUSH); //$NON-NLS-1$
playSelection.setToolTipText(Messages.getString("SearchView.PlayResultsToolTip")); //$NON-NLS-1$
playSelection.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
enqueueSelection(true);
}
});
enqueueSelection = toolkit.createButton(actionSelectionComposite, Messages.getString("SearchView.EnqueueResults"), SWT.PUSH); //$NON-NLS-1$
enqueueSelection.setToolTipText(Messages.getString("SearchView.EnqueueResultsToolTip")); //$NON-NLS-1$
enqueueSelection.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
enqueueSelection(false);
}
});
searchResults = toolkit.createTable(searchResultClient, SWT.CHECK | SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
gd = new GridData(SWT.FILL, SWT.FILL, true, true);
searchResults.setLayoutData(gd);
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnWeightData(10, 35, true));
tableLayout.addColumnData(new ColumnWeightData(250, 150, true));
tableLayout.addColumnData(new ColumnWeightData(200, 150, true));
tableLayout.addColumnData(new ColumnWeightData(200, 150, true));
tableLayout.addColumnData(new ColumnWeightData(30, 75, true));
tableLayout.addColumnData(new ColumnWeightData(30, 75, true));
tableLayout.addColumnData(new ColumnWeightData(30, 50, true));
// Lines visible is ugly under Windows.
if (!Util.isWindows()) {
searchResults.setLinesVisible(true);
}
searchResults.setHeaderVisible(true);
searchResults.setLayout(tableLayout);
TableColumn columnCheck = new TableColumn(searchResults, SWT.NONE);
columnCheck.setText(""); //$NON-NLS-1$
columnCheck.addSelectionListener(new SelectionAdapter(){
public void widgetSelected(SelectionEvent e) {
setAllCheckedStatus(!_boAllSelected);
}
});
TableColumn columnTitle = new TableColumn(searchResults, SWT.NONE);
columnTitle.setText(Messages.getString("PlaylistView.Title")); //$NON-NLS-1$
TableColumn columnArtist = new TableColumn(searchResults, SWT.NONE);
columnArtist.setText(Messages.getString("PlaylistView.Artist")); //$NON-NLS-1$
TableColumn columnAlbum = new TableColumn(searchResults, SWT.NONE);
columnAlbum.setText(Messages.getString("PlaylistView.Album")); //$NON-NLS-1$
TableColumn columnGenre = new TableColumn(searchResults, SWT.NONE);
columnGenre.setText(Messages.getString("PlaylistView.Genre")); //$NON-NLS-1$
TableColumn columnLength = new TableColumn(searchResults, SWT.NONE);
columnLength.setText(Messages.getString("PlaylistView.Length")); //$NON-NLS-1$
TableColumn columnYear = new TableColumn(searchResults, SWT.NONE);
columnYear.setText(Messages.getString("PlaylistView.Year")); //$NON-NLS-1$
fillPlaylistCombo();
toolkit.adapt(playlistSelection);
toolkit.paintBordersFor(searchResultClient);
searchResultsSection.setClient(searchResultClient);
viewer = new TableViewer(searchResults);
viewer.setContentProvider(new ViewContentProvider());
viewer.setLabelProvider(new ViewLabelProvider());
viewer.setInput(getViewSite());
viewer.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
reverseCheckedStatusAtIndex(viewer.getTable().getSelectionIndices()[0]);
}
});
updateResultsActionState(_boSearchHasResults);
setInitialState();
connectListeners();
_parent.pack();
searchText.setFocus();
}
private void setInitialState() {
searchInTitle.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_SCOPE_TITLE));
searchInArtist.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_SCOPE_ARTIST));
searchInAlbum.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_SCOPE_ALBUM));
searchInGenre.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_SCOPE_GENRE));
searchInYear.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_SCOPE_YEAR));
searchCaseSensitive.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_OPTION_CASESENSITIVE));
searchWholeWord.setSelection(Controller.getInstance().getPreferenceStore().getBoolean(PreferenceConstants.SEARCH_OPTION_WHOLEWORD));
}
private void connectListeners() {
searchInTitle.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_SCOPE_TITLE, searchInTitle.getSelection());
}
});
searchInArtist.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_SCOPE_ARTIST, searchInArtist.getSelection());
}
});
searchInAlbum.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_SCOPE_ALBUM, searchInAlbum.getSelection());
}
});
searchInGenre.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_SCOPE_GENRE, searchInGenre.getSelection());
}
});
searchInYear.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_SCOPE_YEAR, searchInYear.getSelection());
}
});
searchCaseSensitive.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_OPTION_CASESENSITIVE, searchCaseSensitive.getSelection());
}
});
searchWholeWord.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent arg0) {
Controller.getInstance().getPreferenceStore().setValue(PreferenceConstants.SEARCH_OPTION_WHOLEWORD, searchWholeWord.getSelection());
}
});
}
private void UpdateEnableState(boolean newState) {
searchTermLabel.setEnabled(newState);
searchText.setEnabled(newState);
searchInTitle.setEnabled(newState);
searchInArtist.setEnabled(newState);
searchInAlbum.setEnabled(newState);
searchInGenre.setEnabled(newState);
searchInYear.setEnabled(newState);
searchCaseSensitive.setEnabled(newState);
searchWholeWord.setEnabled(newState);
}
private String getErrorMessage() {
if (advancedSearchExpComposite.isExpanded()) {
if ((queryText.getText() == null) ||
(queryText.getText().isEmpty())) {
return Messages.getString("SearchView.ErrorEmptyQuery"); //$NON-NLS-1$
} else {
return null;
}
} else {
if ((searchText.getText() == null) ||
(searchText.getText().isEmpty())) {
return Messages.getString("SearchView.ErrorEmptySearchString"); //$NON-NLS-1$
}
boolean selection = searchInTitle.getSelection() ||
searchInArtist.getSelection() ||
searchInAlbum.getSelection() ||
searchInGenre.getSelection() ||
searchInYear.getSelection();
if (!selection) {
return Messages.getString("SearchView.ErrorNoEntitySelected"); //$NON-NLS-1$
}
return null;
}
}
private void doSearch() {
String errorMessage = getErrorMessage();
if (errorMessage == null) {
form.setMessage(null, IMessageProvider.NONE);
searchResults.removeAll();
_boSearchHasResults = false;
searchParamSection.setExpanded(false);
form.reflow(true);
SearchRunnable search;
if (advancedSearchExpComposite.isExpanded()) {
search = new SearchRunnable(queryText.getText());
} else {
search = new SearchRunnable(searchText.getText(),
searchCaseSensitive.getSelection(),
searchWholeWord.getSelection(),
searchInTitle.getSelection(),
searchInArtist.getSelection(),
searchInAlbum.getSelection(),
searchInGenre.getSelection(),
searchInYear.getSelection());
}
ProgressMonitorDialog dialog = new ProgressMonitorDialog(Display.getDefault().getActiveShell());
try {
dialog.run(true, true, search);
} catch (InvocationTargetException e) {
Log.getInstance(SearchView.class).error(e.getMessage());
} catch (InterruptedException e) {
Log.getInstance(SearchView.class).error(e.getMessage());
}
if (search.getQueryStatus()) {
_lastSearch = search.getResults();
viewer.setInput(getViewSite());
setAllCheckedStatus(true);
} else {
form.setMessage(Messages.getString("SearchView.ErrorInQueryExecution"), IMessageProvider.ERROR); //$NON-NLS-1$
}
_boSearchHasResults = viewer.getTable().getItemCount() > 0;
updateResultsActionState(_boSearchHasResults);
} else {
form.setMessage(errorMessage, IMessageProvider.ERROR);
reflowDisplay();
_boSearchHasResults = viewer.getTable().getItemCount() > 0;
updateResultsActionState(_boSearchHasResults);
}
}
private void clearSearchResults() {
searchResults.removeAll();
_lastSearch = null;
_boSearchHasResults = false;
updateResultsActionState(_boSearchHasResults);
searchText.setFocus();
}
private void updateResultsActionState(boolean newState) {
selectAllItem.setEnabled(newState);
selectNoneItem.setEnabled(newState);
reverseSelectionItem.setEnabled(newState);
playlistSelection.setEnabled(newState);
playSelection.setEnabled(newState);
enqueueSelection.setEnabled(newState);
}
private void fillPlaylistCombo() {
playlistSelection.removeAll();
playlistSelection.add(Messages.getString("SearchView.DefaultPlaylist")); //$NON-NLS-1$
playlistSelection.add(Messages.getString("SearchView.NewPlaylist")); //$NON-NLS-1$
Object[] playlists = Controller.getInstance().getPlaylistController().getPlaylistList();
for (int i = 0; i < playlists.length; i++) {
playlistSelection.add(((Playlist) playlists[i]).getName());
}
playlistSelection.setText(playlistSelection.getItem(0));
}
private void enqueueSelection(boolean playFirst) {
String playlistName;
switch (playlistSelection.getSelectionIndex()) {
case 0 : playlistName = Constants.DEFAULT_PLAYLIST_ID; break;
case 1 : {
NewPlaylistAction action = new NewPlaylistAction(Display.getDefault().getActiveShell());
action.run();
playlistName = action.getPlaylistName();
break;
}
default : playlistName = playlistSelection.getItem(playlistSelection.getSelectionIndex());
}
AudioItem audioItem;
FileItem fileItem;
List<IDiskItem> list = new ArrayList<IDiskItem>();
for (int i = 0; i < searchResults.getItemCount(); i++) {
if (searchResults.getItem(i).getChecked()) {
audioItem = (AudioItem) searchResults.getItem(i).getData();
fileItem = new FileItem(audioItem.getFileName(), null);
list.add(fileItem);
}
}
Controller.getInstance().getPlaylistController().addDiskItemsToPlaylist(playlistName, list, playFirst);
}
private List<Boolean> saveCheckedState() {
List<Boolean> result = new ArrayList<Boolean>();
for (int i = 0; i < searchResults.getItemCount(); i++) {
result.add(new Boolean(searchResults.getItem(i).getChecked()));
}
return result;
}
private void restoreCheckedState(List<Boolean> savedState) {
for (int i = 0; i < searchResults.getItemCount(); i++) {
searchResults.getItem(i).setChecked(savedState.get(i).booleanValue());
}
}
private void setAllCheckedStatus(boolean status) {
for (int i = 0; i < searchResults.getItemCount(); i++) {
searchResults.getItem(i).setChecked(status);
}
_boAllSelected = status;
}
private void reverseCheckedStatus() {
for (int i = 0; i < searchResults.getItemCount(); i++) {
searchResults.getItem(i).setChecked(!searchResults.getItem(i).getChecked());
}
}
private void reverseCheckedStatusAtIndex(int index) {
searchResults.getItem(index).setChecked(!searchResults.getItem(index).getChecked());
}
private void reflowDisplay() {
List<Boolean> savedState = saveCheckedState();
searchResults.removeAll();
form.reflow(true);
viewer.setInput(getViewSite());
restoreCheckedState(savedState);
}
@Override
public void setFocus() {
searchText.setFocus();
}
public void dispose() {
_searchImage.dispose();
_selectAllImage.dispose();
_selectNoneImage.dispose();
_reverseSelectionImage.dispose();
toolkit.dispose();
super.dispose();
}
}