Package org.jampa.gui.views

Source Code of org.jampa.gui.views.SearchView

/*
* 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();
  }

}
TOP

Related Classes of org.jampa.gui.views.SearchView

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.