RepeatModeAction() {
   super(
       Messages.getString("JajukJMenuBar.10"),
       IconLoader.getIcon(JajukIcons.REPEAT),
       "ctrl T",
       true,
       false);
   setShortDescription(Messages.getString("CommandJPanel.1"));
 }
 /** Instantiates a new paste action. */
 PasteAction() {
   super(
       Messages.getString("ActionMove.0"),
       IconLoader.getIcon(JajukIcons.PASTE),
       "ctrl V",
       true,
       false);
   setShortDescription(Messages.getString("ActionMove.0"));
 }
Beispiel #3
0
 /** Instantiates a new mute action. */
 MuteAction() {
   super(
       Messages.getString("JajukWindow.2"),
       IconLoader.getIcon(JajukIcons.VOLUME_LEVEL1),
       "F8",
       true,
       true);
   setShortDescription(Messages.getString("JajukWindow.19"));
 }
Beispiel #4
0
 /** Instantiates a new copy action. */
 CopyAction() {
   super(
       Messages.getString("FilesTreeView.3"),
       IconLoader.getIcon(JajukIcons.COPY),
       "ctrl C",
       true,
       false);
   setShortDescription(Messages.getString("FilesTreeView.3"));
 }
 /**
  * Gets the nothing found panel.
  *
  * @return a panel with text explaining why no item has been found
  */
 JPanel getNothingFoundPanel() {
   JPanel out = new JPanel(new MigLayout("ins 5", "grow"));
   JEditorPane jteNothing = new JEditorPane("text/html", Messages.getString("SuggestionView.7"));
   jteNothing.setBorder(null);
   jteNothing.setEditable(false);
   jteNothing.setOpaque(false);
   jteNothing.setToolTipText(Messages.getString("SuggestionView.7"));
   out.add(jteNothing, "center,grow");
   return out;
 }
 /* (non-Javadoc)
  * @see org.jajuk.ui.actions.JajukAction#perform(java.awt.event.ActionEvent)
  */
 @Override
 public void perform(ActionEvent evt) {
   final JEditorPane text = new JEditorPane("text/html", getTraces());
   text.setEditable(false);
   text.setMargin(new Insets(10, 10, 10, 10));
   text.setOpaque(true);
   text.setBackground(Color.WHITE);
   text.setForeground(Color.DARK_GRAY);
   text.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
   final JDialog dialog =
       new JDialog(JajukMainWindow.getInstance(), Messages.getString("DebugLogAction.0"), false);
   JButton jbCopy =
       new JButton(
           Messages.getString("DebugLogAction.2"),
           IconLoader.getIcon(JajukIcons.COPY_TO_CLIPBOARD));
   jbCopy.addActionListener(
       new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
           StringSelection data = new StringSelection(text.getText());
           Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
           clipboard.setContents(data, data);
         }
       });
   JButton jbRefresh =
       new JButton(Messages.getString("DebugLogAction.1"), IconLoader.getIcon(JajukIcons.REFRESH));
   jbRefresh.addActionListener(
       new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
           // Refresh traces
           text.setText(getTraces());
         }
       });
   JButton jbClose =
       new JButton(Messages.getString("Close"), IconLoader.getIcon(JajukIcons.CLOSE));
   jbClose.addActionListener(
       new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
           dialog.dispose();
         }
       });
   dialog.setLayout(new MigLayout("insets 10", "[grow]"));
   JScrollPane panel = new JScrollPane(text);
   UtilGUI.setEscapeKeyboardAction(dialog, panel);
   dialog.add(panel, "grow,wrap");
   dialog.add(jbCopy, "split 3,right,sg button");
   dialog.add(jbRefresh, "split 3,right,sg button");
   dialog.add(jbClose, "right,sg button");
   dialog.setPreferredSize(new Dimension(800, 600));
   dialog.pack();
   dialog.setLocationRelativeTo(JajukMainWindow.getInstance());
   dialog.setVisible(true);
 }
 /**
  * Return label for a type.
  *
  * @param type
  * @return label for a type
  */
 public static String getTypeLabel(Type type) {
   if (type == Type.DIRECTORY) {
     return Messages.getString("Device_type.directory");
   } else if (type == Type.FILES_CD) {
     return Messages.getString("Device_type.file_cd");
   } else if (type == Type.EXTDD) {
     return Messages.getString("Device_type.extdd");
   } else if (type == Type.PLAYER) {
     return Messages.getString("Device_type.player");
   } else if (type == Type.NETWORK_DRIVE) {
     return Messages.getString("Device_type.network_drive");
   } else {
     return null;
   }
 }
 /**
  * Mount the device.
  *
  * @param bManual set whether mount is manual or auto
  * @return whether the device has been mounted. If user is asked for mounting but cancel, this
  *     method returns false.
  * @throws JajukException if device cannot be mounted due to technical reason.
  */
 public boolean mount(final boolean bManual) throws JajukException {
   if (bMounted) {
     // Device already mounted
     throw new JajukException(111);
   }
   // Check if we can mount the device.
   boolean readyToMount = checkDevice();
   // Effective mounting if available.
   if (readyToMount) {
     bMounted = true;
   } else if (pathExists() && isVoid() && bManual) {
     // If the device is void and in manual mode, leave a chance to the user to
     // force it
     final int answer =
         Messages.getChoice(
             "[" + getName() + "] " + Messages.getString("Confirmation_void_refresh"),
             JOptionPane.YES_NO_CANCEL_OPTION,
             JOptionPane.WARNING_MESSAGE);
     // leave if user doesn't confirm to mount the void device
     if (answer != JOptionPane.YES_OPTION) {
       return false;
     } else {
       bMounted = true;
     }
   } else {
     throw new JajukException(11, "\"" + getName() + "\" at URL : " + getUrl());
   }
   // notify views to refresh if needed
   ObservationManager.notify(new JajukEvent(JajukEvents.DEVICE_MOUNT));
   return bMounted;
 }
 /**
  * Return the result panel for local albums.
  *
  * @param type
  * @return the local suggestions panel
  */
 JScrollPane getLocalSuggestionsPanel(SuggestionType type) {
   FlowScrollPanel out = new FlowScrollPanel();
   out.setLayout(new FlowLayout(FlowLayout.LEFT));
   JScrollPane jsp =
       new JScrollPane(
           out,
           ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
           ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
   jsp.setBorder(null);
   out.setScroller(jsp);
   List<Album> albums = null;
   if (type == SuggestionType.BEST_OF) {
     albums = albumsPrefered;
   } else if (type == SuggestionType.NEWEST) {
     albums = albumsNewest;
   } else if (type == SuggestionType.RARE) {
     albums = albumsRare;
   }
   if (albums != null && albums.size() > 0) {
     for (Album album : albums) {
       LocalAlbumThumbnail thumb = new LocalAlbumThumbnail(album, 100, false);
       thumb.populate();
       thumb.getIcon().addMouseListener(new ThumbMouseListener());
       out.add(thumb);
     }
   } else {
     out.add(UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
   }
   return jsp;
 }
 /**
  * Prepare manual refresh.
  *
  * @param bAsk ask user to perform deep or fast refresh
  * @return the user choice (deep or fast)
  * @throws JajukException if user canceled, device cannot be refreshed or device already
  *     refreshing
  */
 int prepareRefresh(final boolean bAsk) throws JajukException {
   if (bAsk) {
     final Object[] possibleValues = {
       Messages.getString("FilesTreeView.60"), // fast
       Messages.getString("FilesTreeView.61"), // deep
       Messages.getString("Cancel")
     }; // cancel
     try {
       SwingUtilities.invokeAndWait(
           new Runnable() {
             @Override
             public void run() {
               choice =
                   JOptionPane.showOptionDialog(
                       JajukMainWindow.getInstance(),
                       Messages.getString("FilesTreeView.59"),
                       Messages.getString("Option"),
                       JOptionPane.DEFAULT_OPTION,
                       JOptionPane.QUESTION_MESSAGE,
                       null,
                       possibleValues,
                       possibleValues[0]);
             }
           });
     } catch (Exception e) {
       Log.error(e);
       choice = Device.OPTION_REFRESH_CANCEL;
     }
     if (choice == Device.OPTION_REFRESH_CANCEL) { // Cancel
       return choice;
     }
   }
   // JajukException are not trapped, will be thrown to the caller
   final Device device = this;
   if (!device.isMounted()) {
     // Leave if user canceled device mounting
     if (!device.mount(true)) {
       return Device.OPTION_REFRESH_CANCEL;
     }
   }
   if (bAlreadyRefreshing) {
     throw new JajukException(107);
   }
   return choice;
 }
Beispiel #11
0
 /**
  * Constructor
  *
  * @param lsl
  */
 public SearchBox(ListSelectionListener lsl) {
   this.lsl = lsl;
   timer.start();
   addKeyListener(this);
   setToolTipText(Messages.getString("SearchBox.0"));
   setBorder(BorderFactory.createEtchedBorder());
   setFont(FontManager.getInstance().getFont(JajukFont.SEARCHBOX));
   Color mediumGray = new Color(172, 172, 172);
   setForeground(mediumGray);
   setBorder(BorderFactory.createLineBorder(Color.BLUE));
 }
 /** Instantiates a new ambience wizard. */
 public AmbienceWizard() {
   super(
       new Wizard.Builder(
               Messages.getString("DigitalDJWizard.56"),
               AmbienceScreen.class,
               JajukMainWindow.getInstance())
           .hSize(600)
           .vSize(500)
           .locale(LocaleManager.getLocale())
           .icon(IconLoader.getIcon(JajukIcons.AMBIENCE)));
 }
 @Override
 public void finish() {
   for (final Ambience ambience : AmbienceWizard.ambiences) {
     AmbienceManager.getInstance().registerAmbience(ambience);
   }
   // commit it to avoid it is lost before the app close
   AmbienceManager.getInstance().commit();
   // Refresh UI
   ObservationManager.notify(new JajukEvent(JajukEvents.AMBIENCES_CHANGE));
   InformationJPanel.getInstance()
       .setMessage(Messages.getString("Success"), InformationJPanel.MessageType.INFORMATIVE);
 }
 /** Populate ambiences combo */
 void populateAmbiences() {
   ambiencesCombo.removeActionListener(ambienceListener);
   ItemListener[] il = ambiencesCombo.getItemListeners();
   for (int i = 0; i < il.length; i++) {
     ambiencesCombo.removeItemListener(il[i]);
   }
   ambiencesCombo.removeAllItems();
   ambiencesCombo.addItem(
       new JLabel(
           Messages.getString("CommandJPanel.19"),
           IconLoader.ICON_CONFIGURATION,
           SwingConstants.LEFT));
   ambiencesCombo.addItem(
       new JLabel(
           "<html><i>" + Messages.getString("DigitalDJWizard.64") + "</i></html>",
           IconLoader.ICON_STYLE,
           SwingConstants.LEFT));
   // Add available ambiences
   for (final Ambience ambience : AmbienceManager.getInstance().getAmbiences()) {
     ambiencesCombo.addItem(
         new JLabel(ambience.getName(), IconLoader.ICON_STYLE, SwingConstants.LEFT));
   }
   // Select right item
   Ambience defaultAmbience =
       AmbienceManager.getInstance()
           .getAmbience(ConfigurationManager.getProperty(CONF_DEFAULT_AMBIENCE));
   if (defaultAmbience != null) {
     for (int i = 0; i < ambiencesCombo.getItemCount(); i++) {
       if (((JLabel) ambiencesCombo.getItemAt(i)).getText().equals(defaultAmbience.getName())) {
         ambiencesCombo.setSelectedIndex(i);
         break;
       }
     }
   } else {
     // or "any" ambience
     ambiencesCombo.setSelectedIndex(1);
   }
   ambiencesCombo.addActionListener(ambienceListener);
 }
 /**
  * Constructor with specified file filter
  *
  * @param jfilter filter to use
  */
 public JajukFileChooser(JajukFileFilter jfilter) {
   setDialogTitle(Messages.getString("JajukFileChooser.0"));
   this.filter = jfilter;
   for (int i = 0; i < jfilter.getFilters().length; i++) {
     addChoosableFileFilter(jfilter.getFilters()[i]);
   }
   setMultiSelectionEnabled(true);
   // don't hide hidden files
   setFileHidingEnabled(false);
   setAcceptAllFileFilterUsed(false);
   // Use default directory to store documents (My Documents under Windows
   // for ie)
   setCurrentDirectory(FileSystemView.getFileSystemView().getDefaultDirectory());
 }
 /** Populate DJs */
 private void populateDJs() {
   try {
     ddbDDJ.setToolTipText(
         "<html>"
             + Messages.getString("CommandJPanel.18")
             + "<p><b>"
             + DigitalDJManager.getCurrentDJ()
             + "</b></html>");
     popupDDJ.removeAll();
     JMenuItem jmiNew = new JMenuItem(ActionManager.getAction(CONFIGURE_DJS));
     popupDDJ.add(jmiNew);
     Iterator<DigitalDJ> it = DigitalDJManager.getInstance().getDJs().iterator();
     while (it.hasNext()) {
       final DigitalDJ dj = it.next();
       JCheckBoxMenuItem jmi =
           new JCheckBoxMenuItem(dj.getName(), IconLoader.ICON_DIGITAL_DJ_16x16);
       jmi.addActionListener(
           new ActionListener() {
             public void actionPerformed(ActionEvent arg0) {
               ConfigurationManager.setProperty(CONF_DEFAULT_DJ, dj.getID());
               DigitalDJManager.setCurrentDJ(dj);
               // force to reselect the item
               populateDJs();
               // update action tooltip on main button with right item
               ActionBase action = ActionManager.getAction(JajukAction.DJ);
               action.setShortDescription(
                   "<html>"
                       + Messages.getString("CommandJPanel.18")
                       + "<p><b>"
                       + dj.getName()
                       + "</b></p></html>");
             }
           });
       popupDDJ.add(jmi);
       jmi.setSelected(ConfigurationManager.getProperty(CONF_DEFAULT_DJ).equals(dj.getID()));
     }
   } catch (Exception e) {
     Log.error(e);
   }
 }
 /**
  * Update global functions tooltip after a change in ambiences or an ambience selection using the
  * ambience selector
  */
 private void updateTooltips() {
   // Selected 'Any" ambience
   if (ambiencesCombo.getSelectedIndex() == 1) {
     ActionBase action = ActionManager.getAction(JajukAction.NOVELTIES);
     action.setShortDescription(Messages.getString("JajukWindow.31"));
     action = ActionManager.getAction(JajukAction.BEST_OF);
     action.setShortDescription(Messages.getString("JajukWindow.24"));
     action = ActionManager.getAction(JajukAction.SHUFFLE_GLOBAL);
     action.setShortDescription(Messages.getString("JajukWindow.23"));
   } else { // Selected an ambience
     Ambience ambience =
         AmbienceManager.getInstance()
             .getAmbienceByName(((JLabel) ambiencesCombo.getSelectedItem()).getText());
     ActionBase action = ActionManager.getAction(JajukAction.NOVELTIES);
     action.setShortDescription(
         "<html>"
             + Messages.getString("JajukWindow.31")
             + "<p><b>"
             + ambience.getName()
             + "</b></p></html>");
     action = ActionManager.getAction(JajukAction.SHUFFLE_GLOBAL);
     action.setShortDescription(
         "<html>"
             + Messages.getString("JajukWindow.23")
             + "<p><b>"
             + ambience.getName()
             + "</b></p></html>");
     action = ActionManager.getAction(JajukAction.BEST_OF);
     action.setShortDescription(
         "<html>"
             + Messages.getString("JajukWindow.24")
             + "<p><b>"
             + ambience.getName()
             + "</b></p></html>");
   }
 }
 /** Create out of the box ambiences */
 public void createDefaultAmbiences() {
   // Define default ambience by style name
   String[] stylesRockPop =
       new String[] {
         "Classic Rock",
         "Pop",
         "Rock",
         "Ska",
         "AlternRock",
         "Instrumental Pop",
         "Instrumental Rock",
         "Southern Rock",
         "Pop/Funk",
         "Folk-Rock",
         "Rock & Roll",
         "Symphonic Rock",
         "Ballad",
         "Christian Rock",
         "JPop",
         "SynthPop"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("0", Messages.getString("Ambience.0"), stylesRockPop));
   String[] stylesRap =
       new String[] {
         "Hip-Hop",
         "R&B",
         "Rap",
         "Fusion",
         "Gangsta",
         "Christian Rap",
         "P**n Groove",
         "Rhytmic Soul",
         "Christian Gangsta"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("1", Messages.getString("Ambience.1"), stylesRap));
   String[] stylesHardRock =
       new String[] {
         "Grunge",
         "Metal",
         "Industrial",
         "Death Metal",
         "Fusion",
         "Punk",
         "Gothic",
         "Darkwave",
         "Fast Fusion",
         "Hard Rock",
         "Gothic Rock",
         "Progressive Rock",
         "Punk Rock",
         "Terror",
         "Negerpunk",
         "Polsk Punk",
         "Heavy Metal",
         "Black Metal",
         "Thrash Metal"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("2", Messages.getString("Ambience.2"), stylesHardRock));
   String[] stylesTechno =
       new String[] {
         "Dance",
         "New Age",
         "Techno",
         "Euro-Techno",
         "Ambient",
         "Trance",
         "House",
         "Game",
         "Space",
         "Techno-Industrial",
         "Eurodance",
         "Dream",
         "Jungle",
         "Rave",
         "Euro-House",
         "Goa",
         "Club-House",
         "Hardcore",
         "Beat"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("3", Messages.getString("Ambience.3"), stylesTechno));
   String[] stylesElectro = new String[] {"Trip-Hop", "Acid", "Electronic", "Club"};
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("4", Messages.getString("Ambience.4"), stylesElectro));
   String[] stylesClassical =
       new String[] {"Classical", "Chorus", "Opera", "Chamber Music", "Sonata", "Symphony"};
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("5", Messages.getString("Ambience.5"), stylesClassical));
   String[] stylesSoft =
       new String[] {
         "Reggae", "Acid Jazz", "Slow Rock", "Jazz", "Easy Listening", "Acoustic", "Ballad"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("6", Messages.getString("Ambience.6"), stylesSoft));
   String[] stylesParty =
       new String[] {
         "Dance",
         "Disco",
         "Funk",
         "Ska",
         "Soul",
         "Eurodance",
         "Big Band",
         "Club",
         "Rhytmic Soul",
         "Dance Hall",
         "Club-House"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("7", Messages.getString("Ambience.7"), stylesParty));
   String[] stylesJazzBlues = new String[] {"Jazz", "Jazz+Funk", "Bass", "Acid Jazz"};
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("8", Messages.getString("Ambience.8"), stylesJazzBlues));
   String[] stylesWorld =
       new String[] {
         "Ethnic", "Native American", "Tribal", "Polka", "Celtic", "Folklore", "Indie"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("9", Messages.getString("Ambience.9"), stylesWorld));
   String[] stylesOthers =
       new String[] {
         "Other",
         "Alternative",
         "Soundtrack",
         "Vocal",
         "Meditative",
         "Comedy",
         "Humour",
         "Speech",
         "Anime"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("10", Messages.getString("Ambience.10"), stylesOthers));
   String[] stylesFolkOldies =
       new String[] {
         "Country",
         "Oldies",
         "Gospel",
         "Pop-Folk",
         "Southern Rock",
         "Cabaret",
         "Retro",
         "Folk-Rock",
         "National Folk",
         "Swing",
         "Rock & Roll",
         "Folk",
         "Revival",
         "Chanson"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("11", Messages.getString("Ambience.11"), stylesFolkOldies));
   String[] stylesInde =
       new String[] {
         "Noise",
         "AlternRock",
         "New Wave",
         "Psychedelic",
         "Acid Punk",
         "Avantgarde",
         "Psychedelic Rock",
         "Freestyle",
         "Drum Solo",
         "Drum & Bass"
       };
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("12", Messages.getString("Ambience.12"), stylesInde));
   String[] stylesLatin = new String[] {"Latin", "Tango", "Samba", "Acapella", "Salsa"};
   AmbienceManager.getInstance()
       .registerAmbience(new Ambience("13", Messages.getString("Ambience.13"), stylesLatin));
 }
  public void initUI() {
    // Search
    double[][] sizeSearch = new double[][] {{3, TableLayout.PREFERRED, 3, 100}, {25}};
    JPanel jpSearch = new JPanel(new TableLayout(sizeSearch));
    sbSearch = new SearchBox(CommandJPanel.this);
    JLabel jlSearch = new JLabel(IconLoader.ICON_SEARCH);
    jlSearch.setToolTipText(Messages.getString("CommandJPanel.23"));
    // Clear search text when clicking on the search icon
    jlSearch.addMouseListener(
        new MouseAdapter() {
          @Override
          public void mouseClicked(MouseEvent e) {
            sbSearch.setText("");
          }
        });
    jpSearch.add(jlSearch, "1,0");
    jpSearch.add(sbSearch, "3,0");

    // History
    JPanel jpHistory = new JPanel();
    jcbHistory = new SteppedComboBox();
    JLabel jlHistory = new JLabel(IconLoader.ICON_HISTORY);
    jlHistory.setToolTipText(Messages.getString("CommandJPanel.0"));
    // - Increase rating button
    ActionBase actionIncRate = ActionManager.getAction(JajukAction.INC_RATE);
    actionIncRate.setName(null);
    final JPopupMenu jpmIncRating = new JPopupMenu();
    for (int i = 1; i <= 10; i++) {
      final int j = i;
      JMenuItem jmi = new JMenuItem("+" + i);
      if (ConfigurationManager.getInt(CONF_INC_RATING) == i) {
        jmi.setFont(FontManager.getInstance().getFont(JajukFont.BOLD));
      }
      // Store selected value
      jmi.addActionListener(
          new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              ConfigurationManager.setProperty(CONF_INC_RATING, "" + j);
            }
          });
      jpmIncRating.add(jmi);
    }
    jbIncRate =
        new DropDownButton(IconLoader.ICON_INC_RATING) {
          private static final long serialVersionUID = 1L;

          @Override
          protected JPopupMenu getPopupMenu() {
            return jpmIncRating;
          }
        };
    jbIncRate.setAction(actionIncRate);
    // we use a combo box model to make sure we get good performances after
    // rebuilding the entire model like after a refresh
    jcbHistory.setModel(new DefaultComboBoxModel(History.getInstance().getHistory()));
    // None selection because if we start in stop mode, a selection of the
    // first item will not launch the track because the selected item is
    // still the same and no action event is thrown (Java >= 1.6)
    jcbHistory.setSelectedItem(null);
    int iWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 2);
    // size of popup
    jcbHistory.setPopupWidth(iWidth);
    // size of the combo itself, keep it! as text can be very long
    jcbHistory.setPreferredSize(new Dimension(250, 25));
    jcbHistory.setMinimumSize(new Dimension(0, 25));
    jcbHistory.setToolTipText(Messages.getString("CommandJPanel.0"));
    jcbHistory.addActionListener(CommandJPanel.this);
    JToolBar jtbIncRate = new JToolBar();
    jtbIncRate.setFloatable(false);
    jbIncRate.addToToolBar(jtbIncRate);
    double[][] sizeHistory =
        new double[][] {
          {3, TableLayout.PREFERRED, 3, TableLayout.FILL, 10, TableLayout.PREFERRED}, {25}
        };
    jpHistory.setLayout(new TableLayout(sizeHistory));
    jpHistory.add(jlHistory, "1,0");
    jpHistory.add(jcbHistory, "3,0");
    jpHistory.add(jtbIncRate, "5,0");

    // Mode toolbar
    // we need an inner toolbar to apply size properly
    JToolBar jtbModes = new JToolBar();
    jtbModes.setBorder(null);
    // make it not floatable as this behavior is managed by vldocking
    jtbModes.setFloatable(false);
    jtbModes.setRollover(true);
    jbRepeat =
        new JajukToggleButton(ActionManager.getAction(JajukAction.REPEAT_MODE_STATUS_CHANGE));
    jbRepeat.setSelected(ConfigurationManager.getBoolean(CONF_STATE_REPEAT));
    jbRandom =
        new JajukToggleButton(ActionManager.getAction(JajukAction.SHUFFLE_MODE_STATUS_CHANGED));
    jbRandom.setSelected(ConfigurationManager.getBoolean(CONF_STATE_SHUFFLE));
    jbContinue =
        new JajukToggleButton(ActionManager.getAction(JajukAction.CONTINUE_MODE_STATUS_CHANGED));
    jbContinue.setSelected(ConfigurationManager.getBoolean(CONF_STATE_CONTINUE));
    jbIntro = new JajukToggleButton(ActionManager.getAction(JajukAction.INTRO_MODE_STATUS_CHANGED));
    jbIntro.setSelected(ConfigurationManager.getBoolean(CONF_STATE_INTRO));
    jtbModes.add(jbRepeat);
    jtbModes.addSeparator();
    jtbModes.add(jbRandom);
    jtbModes.addSeparator();
    jtbModes.add(jbContinue);
    jtbModes.addSeparator();
    jtbModes.add(jbIntro);

    // Volume
    jpVolume = new JPanel();
    ActionUtil.installKeystrokes(
        jpVolume,
        ActionManager.getAction(JajukAction.DECREASE_VOLUME),
        ActionManager.getAction(JajukAction.INCREASE_VOLUME));

    jpVolume.setLayout(new BoxLayout(jpVolume, BoxLayout.X_AXIS));
    int iVolume = (int) (100 * ConfigurationManager.getFloat(CONF_VOLUME));
    if (iVolume > 100) { // can occur in some undefined cases
      iVolume = 100;
    }
    jsVolume = new JSlider(0, 100, iVolume);
    jpVolume.add(jsVolume);
    jpVolume.add(Box.createHorizontalStrut(5));
    jpVolume.add(jbMute);
    jsVolume.setToolTipText(Messages.getString("CommandJPanel.14"));
    jsVolume.addChangeListener(CommandJPanel.this);
    jsVolume.addMouseWheelListener(CommandJPanel.this);

    // Special functions toolbar
    // Ambience combo
    ambiencesCombo = new SteppedComboBox();
    iWidth = (int) (Toolkit.getDefaultToolkit().getScreenSize().getWidth() / 4);
    ambiencesCombo.setPopupWidth(iWidth);
    ambiencesCombo.setFont(FontManager.getInstance().getFont(JajukFont.BOLD_L));
    // size of the combo itself
    ambiencesCombo.setRenderer(
        new BasicComboBoxRenderer() {
          private static final long serialVersionUID = -6943363556191659895L;

          public Component getListCellRendererComponent(
              JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
            super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
            JLabel jl = (JLabel) value;
            setIcon(jl.getIcon());
            setText(jl.getText());
            return this;
          }
        });
    ambiencesCombo.setToolTipText(Messages.getString("DigitalDJWizard.66"));
    populateAmbiences();
    ambienceListener = new AmbienceListener();
    ambiencesCombo.addActionListener(ambienceListener);
    jtbSpecial = new JToolBar();
    jtbSpecial.setBorder(null);
    jtbSpecial.setRollover(true);
    jtbSpecial.setFloatable(false);
    ddbGlobalRandom =
        new DropDownButton(IconLoader.ICON_SHUFFLE_GLOBAL) {
          private static final long serialVersionUID = 1L;

          @Override
          protected JPopupMenu getPopupMenu() {
            return popupGlobalRandom;
          }
        };
    ddbGlobalRandom.setAction(ActionManager.getAction(JajukAction.SHUFFLE_GLOBAL));
    popupGlobalRandom = new JPopupMenu();
    // Global shuffle
    jmiShuffleModeSong = new JRadioButtonMenuItem(Messages.getString("CommandJPanel.20"));
    jmiShuffleModeSong.addActionListener(this);
    // album / album
    jmiShuffleModeAlbum = new JRadioButtonMenuItem(Messages.getString("CommandJPanel.21"));
    jmiShuffleModeAlbum.addActionListener(this);
    // Shuffle album / album
    jmiShuffleModeAlbum2 = new JRadioButtonMenuItem(Messages.getString("CommandJPanel.22"));
    jmiShuffleModeAlbum2.addActionListener(this);
    if (ConfigurationManager.getProperty(CONF_GLOBAL_RANDOM_MODE).equals(MODE_TRACK)) {
      jmiShuffleModeSong.setSelected(true);
    } else if (ConfigurationManager.getProperty(CONF_GLOBAL_RANDOM_MODE).equals(MODE_ALBUM2)) {
      jmiShuffleModeAlbum2.setSelected(true);
    } else {
      jmiShuffleModeAlbum.setSelected(true);
    }
    ButtonGroup bgGlobalRandom = new ButtonGroup();
    bgGlobalRandom.add(jmiShuffleModeSong);
    bgGlobalRandom.add(jmiShuffleModeAlbum);
    bgGlobalRandom.add(jmiShuffleModeAlbum2);
    popupGlobalRandom.add(jmiShuffleModeSong);
    popupGlobalRandom.add(jmiShuffleModeAlbum);
    popupGlobalRandom.add(jmiShuffleModeAlbum2);
    ddbGlobalRandom.setText(""); // no text visible

    jbBestof = new JajukButton(ActionManager.getAction(JajukAction.BEST_OF));

    ddbNovelties =
        new DropDownButton(IconLoader.ICON_NOVELTIES) {
          private static final long serialVersionUID = 1L;

          @Override
          protected JPopupMenu getPopupMenu() {
            return popupNovelties;
          }
        };
    ddbNovelties.setAction(ActionManager.getAction(JajukAction.NOVELTIES));
    popupNovelties = new JPopupMenu();
    jmiNoveltiesModeSong = new JRadioButtonMenuItem(Messages.getString("CommandJPanel.20"));
    jmiNoveltiesModeSong.addActionListener(this);
    jmiNoveltiesModeAlbum = new JRadioButtonMenuItem(Messages.getString("CommandJPanel.22"));
    jmiNoveltiesModeAlbum.addActionListener(this);
    if (ConfigurationManager.getProperty(CONF_NOVELTIES_MODE).equals(MODE_TRACK)) {
      jmiNoveltiesModeSong.setSelected(true);
    } else {
      jmiNoveltiesModeAlbum.setSelected(true);
    }
    ButtonGroup bgNovelties = new ButtonGroup();
    bgNovelties.add(jmiNoveltiesModeSong);
    bgNovelties.add(jmiNoveltiesModeAlbum);
    popupNovelties.add(jmiNoveltiesModeSong);
    popupNovelties.add(jmiNoveltiesModeAlbum);
    ddbNovelties.setText(""); // no text visible

    jbNorm = new JajukButton(ActionManager.getAction(FINISH_ALBUM));
    popupDDJ = new JPopupMenu();
    ddbDDJ =
        new DropDownButton(IconLoader.ICON_DIGITAL_DJ) {
          private static final long serialVersionUID = 1L;

          @Override
          protected JPopupMenu getPopupMenu() {
            return popupDDJ;
          }
        };
    ddbDDJ.setAction(ActionManager.getAction(JajukAction.DJ));
    populateDJs();
    // no text visible
    ddbDDJ.setText("");

    popupWebRadio = new XJPopupMenu(Main.getWindow());
    ddbWebRadio =
        new DropDownButton(IconLoader.ICON_WEBRADIO) {
          private static final long serialVersionUID = 1L;

          @Override
          protected JPopupMenu getPopupMenu() {
            return popupWebRadio;
          }
        };
    ddbWebRadio.setAction(ActionManager.getAction(JajukAction.WEB_RADIO));
    populateWebRadios();
    // no text
    ddbWebRadio.setText("");

    ddbDDJ.addToToolBar(jtbSpecial);
    ddbNovelties.addToToolBar(jtbSpecial);
    ddbGlobalRandom.addToToolBar(jtbSpecial);
    jtbSpecial.add(jbBestof);
    jtbSpecial.add(jbNorm);

    // Radio tool bar
    JToolBar jtbWebRadio = new JToolBar();
    jtbWebRadio.setBorder(null);
    jtbWebRadio.setRollover(true);
    jtbWebRadio.setFloatable(false);
    ddbWebRadio.addToToolBar(jtbWebRadio);

    // Play toolbar
    JToolBar jtbPlay = new JToolBar();
    jtbPlay.setBorder(null);
    jtbPlay.setFloatable(false);
    // add some space to get generic size
    jtbPlay.setRollover(true);
    ActionUtil.installKeystrokes(
        jtbPlay, ActionManager.getAction(NEXT_ALBUM), ActionManager.getAction(PREVIOUS_ALBUM));
    jbPrevious = new JajukButton(ActionManager.getAction(PREVIOUS_TRACK));
    jbNext = new JajukButton(ActionManager.getAction(NEXT_TRACK));
    jbRew = new JPressButton(ActionManager.getAction(REWIND_TRACK));
    jbPlayPause = new JajukButton(ActionManager.getAction(PLAY_PAUSE_TRACK));
    jbStop = new JajukButton(ActionManager.getAction(STOP_TRACK));
    jbFwd = new JPressButton(ActionManager.getAction(FAST_FORWARD_TRACK));

    jtbPlay.add(jbPrevious);
    jtbPlay.add(jbRew);
    jtbPlay.add(jbPlayPause);
    jtbPlay.add(jbStop);
    jtbPlay.add(jbFwd);
    jtbPlay.add(jbNext);

    // Add items
    FormLayout layout =
        new FormLayout(
            // --columns
            "3dlu,fill:min(10dlu;p):grow(0.5), 3dlu, "
                + // ambience
                "left:p, 2dlu"
                + // smart toolbar
                ", min(0dlu;p):grow(0.04), 3dlu,"
                + // glue
                " right:p, 10dlu, "
                + // search /modes
                "fill:p, 5dlu, "
                + // history/player
                "fill:min(60dlu;p):grow(0.2),3dlu", // volume/part of
            // history
            // --rows
            "2dlu, p, 2dlu, p, 2dlu"); // rows
    PanelBuilder builder = new PanelBuilder(layout); // , new
    // FormDebugPanel() );
    CellConstraints cc = new CellConstraints();
    // Add items
    builder.add(jtbWebRadio, cc.xyw(2, 2, 3)); // grid width = 3
    builder.add(ambiencesCombo, cc.xy(2, 4));
    builder.add(jtbSpecial, cc.xy(4, 4));
    builder.add(jpSearch, cc.xyw(6, 2, 4));
    builder.add(jpHistory, cc.xyw(10, 2, 4));
    builder.add(jtbModes, cc.xy(8, 4));
    builder.add(jtbPlay, cc.xy(10, 4));
    builder.add(jpVolume, cc.xy(12, 4));
    JPanel p = builder.getPanel();
    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    add(p);
    // register to player events
    ObservationManager.register(CommandJPanel.this);

    // if a track is playing, display right state
    if (FIFO.getInstance().getCurrentFile() != null) {
      // update initial state
      update(
          new Event(
              EventSubject.EVENT_PLAYER_PLAY,
              ObservationManager.getDetailsLastOccurence(EventSubject.EVENT_PLAYER_PLAY)));
      // update the history bar
      update(new Event(EventSubject.EVENT_FILE_LAUNCHED));
      // check if some track has been launched before the view has been
      // displayed
      update(new Event(EventSubject.EVENT_HEART_BEAT));
    }
    // start timer
    timer.start();
  }
 SaveAsAction() {
   super(
       Messages.getString("PhysicalPlaylistRepositoryView.2"),
       IconLoader.getIcon(JajukIcons.SAVE_AS),
       true);
 }
 /** Instantiates a new push selection action. */
 PushSelectionAction() {
   super(Messages.getString("TracksTableView.8"), IconLoader.getIcon(JajukIcons.PUSH), true);
   setShortDescription(Messages.getString("TracksTableView.8"));
 }
 /**
  * Display currently copied file to information panel.
  *
  * @param file
  */
 private void showMessage(java.io.File file) {
   String message = Messages.getString("Device.45");
   message += file.getAbsolutePath() + "]";
   InformationJPanel.getInstance().setMessage(message, InformationJPanel.MessageType.INFORMATIVE);
 }
  /*
   * (non-Javadoc)
   *
   * @see org.jajuk.ui.views.IView#populate()
   */
  @Override
  public void initUI() {
    tabs = new JTabbedPane();
    // Remove tab border, see
    // http://forum.java.sun.com/thread.jspa?threadID=260746&messageID=980405
    class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI {
      @Override
      protected Insets getContentBorderInsets(int tabPlacement) {
        return new Insets(0, 0, 0, 0);
      }

      @Override
      protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) {
        // nothing to do here...
      }
    }
    // Now use the new TabbedPaneUI
    tabs.setUI(new MyTabbedPaneUI());
    // Fill tabs with empty tabs
    tabs.addTab(
        Messages.getString("SuggestionView.1"),
        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
    tabs.addTab(
        Messages.getString("SuggestionView.2"),
        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
    tabs.addTab(
        Messages.getString("SuggestionView.5"),
        UtilGUI.getCentredPanel(new JLabel(Messages.getString("WikipediaView.3"))));
    tabs.addTab(
        Messages.getString("SuggestionView.3"), new JLabel(Messages.getString("SuggestionView.7")));
    tabs.addTab(
        Messages.getString("SuggestionView.4"), new JLabel(Messages.getString("SuggestionView.7")));
    // Refresh tabs on demand only, add changelisterner after tab creation to
    // avoid that the stored tab is overwrited at startup
    tabs.addChangeListener(
        new ChangeListener() {
          @Override
          public void stateChanged(ChangeEvent arg0) {
            refreshLastFMCollectionTabs();
            // store the selected tab
            Conf.setProperty(
                getClass().getName()
                    + "_"
                    + ((getPerspective() == null) ? "solo" : getPerspective().getID()),
                Integer.toString(tabs.getSelectedIndex()).toString());
          }
        });
    if (Conf.containsProperty(
        getClass().getName()
            + "_"
            + ((getPerspective() == null) ? "solo" : getPerspective().getID()))) {
      int index =
          Conf.getInt(
              getClass().getName()
                  + "_"
                  + ((getPerspective() == null) ? "solo" : getPerspective().getID()));
      if (index > 0 && index < tabs.getTabCount()) {
        tabs.setSelectedIndex(index);
      }
    }
    // Add panels
    refreshLocalCollectionTabs();
    // Add tabs
    setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
    add(tabs);
    // Look for events
    ObservationManager.register(this);
  }
 /*
  * (non-Javadoc)
  *
  * @see org.jajuk.ui.views.IView#getDesc()
  */
 @Override
 public String getDesc() {
   return Messages.getString("SuggestionView.0");
 }
  /** Refresh last fm collection tabs. */
  private void refreshLastFMCollectionTabs() {
    String newArtist = null;
    File current = QueueModel.getPlayingFile();
    if (current != null) {
      newArtist = current.getTrack().getArtist().getName2();
    }
    // if none track playing
    if (current == null
        // Last.FM infos is disable
        || !Conf.getBoolean(Const.CONF_LASTFM_INFO)
        // None internet access option is set
        || Conf.getBoolean(Const.CONF_NETWORK_NONE_INTERNET_ACCESS)
        // If unknown artist
        || (newArtist == null || newArtist.equals(Messages.getString(UNKNOWN_ARTIST)))) {
      // Set empty panels
      SwingUtilities.invokeLater(
          new Runnable() {
            @Override
            public void run() {
              stopAllBusyLabels();
              tabs.setComponentAt(3, new JLabel(Messages.getString("SuggestionView.7")));
              tabs.setComponentAt(4, new JLabel(Messages.getString("SuggestionView.7")));
            }
          });
      return;
    }
    // Check if artist changed, otherwise, just leave
    if (newArtist.equals(this.artist)) {
      return;
    }
    // Save current artist
    artist = newArtist;
    // Display a busy panel in the mean-time
    SwingUtilities.invokeLater(
        new Runnable() {
          @Override
          public void run() {
            JXBusyLabel busy1 = new JXBusyLabel();
            busy1.setBusy(true);
            JXBusyLabel busy2 = new JXBusyLabel();
            busy2.setBusy(true);
            // stop all existing busy labels before we add the new ones...
            stopAllBusyLabels();
            tabs.setComponentAt(3, UtilGUI.getCentredPanel(busy1));
            tabs.setComponentAt(4, UtilGUI.getCentredPanel(busy2));
          }
        });
    // Use a swing worker as construct takes a lot of time
    SwingWorker<Void, Void> sw =
        new SwingWorker<Void, Void>() {
          JScrollPane jsp1;
          JScrollPane jsp2;

          @Override
          public Void doInBackground() {
            try {
              // Fetch last.fm calls and downloads covers
              preFetchOthersAlbum();
              preFetchSimilarArtists();
            } catch (Exception e) {
              Log.error(e);
            }
            return null;
          }

          @Override
          public void done() {
            jsp1 = getLastFMSuggestionsPanel(SuggestionType.OTHERS_ALBUMS, false);
            jsp2 = getLastFMSuggestionsPanel(SuggestionType.SIMILAR_ARTISTS, false);
            stopAllBusyLabels();
            tabs.setComponentAt(3, (jsp1 == null) ? new JPanel() : jsp1);
            tabs.setComponentAt(4, (jsp2 == null) ? new JPanel() : jsp2);
          }
        };
    sw.execute();
  }
 /** Create common UI for property wizards */
 void populate() {
   getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
   Util.setShuffleLocation(this, 400, 400);
   jlItemChoice = new JLabel(Messages.getString("CustomPropertyWizard.0"));
   jlName = new JLabel(Messages.getString("CustomPropertyWizard.1"));
   jcbItemChoice = new JComboBox();
   jcbItemChoice.addItem(Messages.getString("Item_Track"));
   jcbItemChoice.addItem(Messages.getString("Item_File"));
   jcbItemChoice.addItem(Messages.getString("Item_Style"));
   jcbItemChoice.addItem(Messages.getString("Item_Author"));
   jcbItemChoice.addItem(Messages.getString("Item_Album"));
   jcbItemChoice.addItem(Messages.getString("Item_Device"));
   jcbItemChoice.addItem(Messages.getString("Item_Directory"));
   jcbItemChoice.addItem(Messages.getString("Item_Playlist")); // playlist
   //
   jcbItemChoice.addItem(Messages.getString("Item_Year"));
   // file
   // actually
   //
   okp = new OKCancelPanel(this);
   okp.getOKButton().setEnabled(false);
   // In physical perspective, default item is file, otherwise, it is track
   if (PerspectiveManager.getCurrentPerspective().getClass().equals(FilesPerspective.class)) {
     jcbItemChoice.setSelectedIndex(1);
   } else {
     jcbItemChoice.setSelectedIndex(0);
   }
   jcbItemChoice.addItemListener(this);
   jpMain = new JPanel();
 }
 /** Instantiates a new slimbar action. */
 SlimbarAction() {
   super(
       Messages.getString("JajukSlimWindow.0"), IconLoader.getIcon(JajukIcons.SLIM_WINDOW), true);
   setShortDescription(Messages.getString("JajukSlimWindow.0"));
 }
  /*
   * (non-Javadoc)
   *
   * @see org.jajuk.ui.views.IView#populate()
   */
  public void initUI() {
    jlLanguage = new JLabel(Messages.getString("WikipediaView.1"));
    jcbLanguage = new JComboBox();
    for (String sDesc : Messages.getDescs()) {
      jcbLanguage.addItem(sDesc);
    }
    // get stored language
    jcbLanguage.setSelectedItem(
        Messages.getDescForLocal(ConfigurationManager.getProperty(CONF_WIKIPEDIA_LANGUAGE)));
    jcbLanguage.addActionListener(this);
    // Buttons
    ActionBase aCopy = ActionManager.getAction(JajukAction.COPY_TO_CLIPBOARD);
    jbCopy = new JButton(aCopy);
    jbLaunchInExternalBrowser = new JButton(ActionManager.getAction(JajukAction.LAUNCH_IN_BROWSER));
    // Remove text inside the buttons
    jbLaunchInExternalBrowser.setText(null);
    jbCopy.setText(null);
    ButtonGroup bg = new ButtonGroup();
    jbAuthorSearch = new JToggleButton(IconLoader.ICON_AUTHOR, false);
    jbAuthorSearch.setToolTipText(Messages.getString("WikipediaView.5"));
    // Select author search (default)
    jbAuthorSearch.setSelected(true);
    jbAuthorSearch.addActionListener(this);
    jbAlbumSearch = new JToggleButton(IconLoader.ICON_ALBUM, true);
    jbAlbumSearch.setToolTipText(Messages.getString("WikipediaView.6"));
    jbAlbumSearch.addActionListener(this);
    jbTrackSearch = new JToggleButton(IconLoader.ICON_TRACK, false);
    jbTrackSearch.setToolTipText(Messages.getString("WikipediaView.7"));
    jbTrackSearch.addActionListener(this);
    // Group this three mutual exclusive buttons
    bg.add(jbAuthorSearch);
    bg.add(jbAlbumSearch);
    bg.add(jbTrackSearch);

    JToolBar jtb = new JToolBar();
    jtb.setFloatable(false);
    jtb.setRollover(true);
    jtb.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));
    // Add items
    jtb.add(jbAuthorSearch);
    jtb.add(jbAlbumSearch);
    jtb.add(jbTrackSearch);
    jtb.addSeparator();
    jtb.add(jbCopy);
    jtb.add(jbLaunchInExternalBrowser);
    jtb.addSeparator();
    jtb.add(jcbLanguage);

    JPanel jpCommand = new JPanel();
    jpCommand.setBorder(BorderFactory.createEtchedBorder());
    jpCommand.setLayout(new FlowLayout(FlowLayout.LEFT));
    jpCommand.add(jtb);

    // global layout
    double size[][] = {{2, TableLayout.FILL, 5}, {TableLayout.PREFERRED, 5, TableLayout.FILL}};
    setLayout(new TableLayout(size));
    browser = new JajukHtmlPanel();
    add(jpCommand, "1,0");
    add(browser, "1,2");

    // Display default page at startup is none track launch
    // avoid to launch this if a track is playing
    // to avoid thread concurrency
    if (FIFO.getInstance().getCurrentFile() == null) {
      reset();
    }

    // subscriptions to events
    ObservationManager.register(WikipediaView.this);

    // force event
    update(
        new Event(
            EventSubject.EVENT_FILE_LAUNCHED,
            ObservationManager.getDetailsLastOccurence(EventSubject.EVENT_FILE_LAUNCHED)));
  }
 CDDBSelectionAction() {
   super(Messages.getString("TracksTreeView.34"), IconLoader.getIcon(JajukIcons.CDDB), true);
   setShortDescription(Messages.getString("TracksTreeView.34"));
 }
 /*
  * (non-Javadoc)
  *
  * @see org.jajuk.ui.views.IView#getDesc()
  */
 public String getDesc() {
   return Messages.getString("WikipediaView.0");
 }