Project: tomighty
/*
 * Copyright (c) 2010-2012 Célio Cidral Junior. 
 * 
 *     Licensed under the Apache License, Version 2.0 (the "License"); 
 *     you may not use this file except in compliance with the License. 
 *     You may obtain a copy of the License at 
 * 
 *         http://www.apache.org/licenses/LICENSE-2.0 
 * 
 *     Unless required by applicable law or agreed to in writing, software 
 *     distributed under the License is distributed on an "AS IS" BASIS, 
 *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 *     See the License for the specific language governing permissions and 
 *     limitations under the License. 
 */
 
package org.tomighty.ui.options; 
 
import java.awt.Component; 
 
import javax.annotation.PostConstruct; 
import javax.inject.Inject; 
import javax.swing.DefaultComboBoxModel; 
import javax.swing.JCheckBox; 
import javax.swing.JComboBox; 
import javax.swing.JComponent; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.MutableComboBoxModel; 
 
import org.tomighty.config.Options; 
import org.tomighty.i18n.Messages; 
import org.tomighty.ui.theme.Theme; 
import org.tomighty.ui.theme.themes.BrushedMetal; 
import org.tomighty.ui.theme.themes.Gradient; 
import org.tomighty.ui.theme.themes.Grainy; 
import org.tomighty.ui.theme.themes.Shiny; 
import org.tomighty.util.FriendlyName; 
 
@SuppressWarnings("serial"
public class UserInterface extends OptionPanel implements OptionGroup { 
 
 @Inject private Options options; 
 @Inject private Messages messages; 
 private JLabel themeLabel; 
 private MutableComboBoxModel themeOptions; 
 private JCheckBox autoHideOption; 
 private JCheckBox draggableWindowOption; 
 private JCheckBox showTimeOnTrayOption; 
 
 public UserInterface() { 
  autoHideOption = new JCheckBox(); 
  draggableWindowOption = new JCheckBox(); 
  showTimeOnTrayOption = new JCheckBox(); 
  add(createThemeOptions()); 
  add(autoHideOption); 
  add(draggableWindowOption); 
  add(showTimeOnTrayOption); 
 
  
 private JComponent createThemeOptions() { 
  themeLabel = new JLabel(); 
  themeOptions = new DefaultComboBoxModel(); 
  themeOptions.addElement(new ThemeOption(BrushedMetal.class)); 
  themeOptions.addElement(new ThemeOption(Gradient.class)); 
  themeOptions.addElement(new ThemeOption(Grainy.class)); 
  themeOptions.addElement(new ThemeOption(Shiny.class)); 
   
  JPanel panel = new JPanel(); 
  panel.add(themeLabel); 
  panel.add(new JComboBox(themeOptions)); 
  return panel; 
 
 
    @PostConstruct 
 public void initialize() { 
  themeLabel.setText(messages.get("Theme")); 
  autoHideOption.setText(messages.get("Auto hide window")); 
  draggableWindowOption.setText(messages.get("Allows dragging the window around")); 
  showTimeOnTrayOption.setText(messages.get("Show remaining time on tray")); 
 
 
 @Override 
 public String name() { 
  return messages.get("User interface"); 
 
 
 @Override 
 public Component asComponent() { 
  return this
 
 
 @Override 
 public void readConfiguration() { 
  autoHideOption.setSelected(options.ui().autoHideWindow()); 
  draggableWindowOption.setSelected(options.ui().draggableWindow()); 
  showTimeOnTrayOption.setSelected(options.ui().showTimeOnTray()); 
  themeOptions.setSelectedItem(new ThemeOption(options.ui().theme().getClass())); 
 
 
 @Override 
 public void saveConfiguration() { 
  options.ui().autoHide(autoHideOption.isSelected()); 
  options.ui().draggableWindow(draggableWindowOption.isSelected()); 
  options.ui().showTimeOnTray(showTimeOnTrayOption.isSelected()); 
  options.ui().theme(((ThemeOption)themeOptions.getSelectedItem()).clazz()); 
 
  
 private class ThemeOption { 
 
  private final Class<? extends Theme> clazz; 
 
  public ThemeOption(Class<? extends Theme> clazz) { 
   this.clazz = clazz; 
  
   
  public Class<? extends Theme> clazz() { 
   return clazz; 
  
   
  @Override 
  public boolean equals(Object obj) { 
   if(!(obj instanceof ThemeOption)) { 
    return false
   
   return clazz.equals(((ThemeOption)obj).clazz); 
  
   
  @Override 
  public String toString() { 
   String name; 
   FriendlyName friendlyName = clazz.getAnnotation(FriendlyName.class); 
   if(friendlyName == null) { 
    name = clazz.getSimpleName(); 
   else { 
    name = friendlyName.value(); 
   
   return messages.get(name); 
  
   
 
 
}