package org.korsakow.ide.ui.interfacebuilder.panel;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.JComponent;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.TransferHandler;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.dsrg.soenea.domain.MapperException;
import org.korsakow.domain.Settings;
import org.korsakow.domain.interf.ISettings;
import org.korsakow.domain.mapper.input.SettingsInputMapper;
import org.korsakow.ide.lang.LanguageBundle;
import org.korsakow.ide.resources.WidgetType;
import org.korsakow.ide.ui.components.KList;
import org.korsakow.ide.ui.components.ToolTipRenderer;
import org.korsakow.ide.ui.dnd.WidgetTypeTransferable;
import org.korsakow.ide.ui.interfacebuilder.WidgetCellRenderer;
import org.korsakow.ide.util.UIUtil;
public class WidgetsPanel extends JPanel
{
private static final Hashtable<WidgetType, String> tooltips = new Hashtable<WidgetType, String>();
private static Map<String, Object[]> ListSections = new HashMap<String, Object[]>();
static
{
ListSections.put("", new Object[] {
WidgetType.MainMedia,
WidgetType.SnuAutoLink,
WidgetType.InsertText,
WidgetType.Subtitles,
});
ListSections.put("Media Controls", new Object[] {
" ",
WidgetType.Scrubber,
WidgetType.PlayButton,
WidgetType.MasterVolume,
WidgetType.PlayTime,
WidgetType.TotalTime,
WidgetType.FullscreenButton,
});
ListSections.put("Experimental", new Object[] {
" ",
WidgetType.MediaControls,
WidgetType.Comments,
WidgetType.History,
WidgetType.SnuAutoMultiLink,
});
tooltips.put(WidgetType.MainMedia, LanguageBundle.getString("widget.mainmedia.tooltip"));
tooltips.put(WidgetType.SnuAutoLink, LanguageBundle.getString("widget.snuautolink.tooltip"));
tooltips.put(WidgetType.SnuFixedLink, LanguageBundle.getString("widget.snufixedlink.tooltip"));
tooltips.put(WidgetType.SnuAutoMultiLink, LanguageBundle.getString("widget.snuautomultilink.tooltip"));
tooltips.put(WidgetType.InsertText, LanguageBundle.getString("widget.inserttext.tooltip"));
tooltips.put(WidgetType.Subtitles, LanguageBundle.getString("widget.subtitles.tooltip"));
tooltips.put(WidgetType.MasterVolume, LanguageBundle.getString("widget.mastervolume.tooltip"));
tooltips.put(WidgetType.MediaArea, LanguageBundle.getString("widget.mediaarea.tooltip"));
tooltips.put(WidgetType.History, LanguageBundle.getString("widget.history.tooltip"));
tooltips.put(WidgetType.Scrubber, LanguageBundle.getString("widget.scrubber.tooltip"));
}
private static boolean isAltDown;
private KList widgetList;
public WidgetsPanel()
{
initUI();
initListeners();
}
private void initUI()
{
setLayout(new BorderLayout());
DefaultListModel listModel = new DefaultListModel();
for (Object o : ListSections.get(""))
listModel.addElement(o);
for (Object o : ListSections.get("Media Controls"))
listModel.addElement(o);
boolean showExperimental;
try {
ISettings settings = SettingsInputMapper.find();
showExperimental = settings.getBoolean(Settings.ShowExperimentalWidgets);
} catch (MapperException e) {
showExperimental = false;
}
if (showExperimental)
for (Object o : ListSections.get("Experimental"))
listModel.addElement(o);
widgetList = new KList();
widgetList.setModel(listModel);
UIUtil.setDragOnPress(widgetList);
widgetList.setCellRenderer(new WidgetCellRenderer());
widgetList.setToolTipRenderer(new MyToolTipRenderer());
widgetList.setTransferHandler(new TransferHandler() {
@Override
public int getSourceActions(JComponent component)
{
return TransferHandler.COPY;
}
@Override
public Transferable createTransferable(JComponent component)
{
JList list = (JList)component;
Object value = list.getSelectedValue();
if (value == null || (value instanceof WidgetType == false))
return null;
return new WidgetTypeTransferable((WidgetType)value, isAltDown);
}
@Override
public boolean canImport(JComponent comp, DataFlavor[] flavours) {
return false;
}
@Override
public boolean importData(JComponent comp, Transferable t) {
return false;
}
});
widgetList.setDragEnabled(true);
final JScrollPane scroll = new JScrollPane(widgetList) {
@Override
public Dimension getPreferredSize() {
final Dimension preferredSize = widgetList.getPreferredSize();
preferredSize.height += 10;
return preferredSize;
}
};
add(scroll);
}
private void initListeners()
{
widgetList.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent event) {
WidgetsPanel.isAltDown = event.isAltDown();
}
});
widgetList.addListSelectionListener(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
Object value = widgetList.getSelectedValue();
if (value instanceof WidgetType)
widgetList.setToolTipText(tooltips.get(value));
else
widgetList.setToolTipText("");
}
});
}
private class MyToolTipRenderer implements ToolTipRenderer
{
public String getToolTipText(MouseEvent event)
{
JList list = (JList)event.getSource();
int index = list.locationToIndex(event.getPoint());
if (index == -1)
return "";
if (list.getModel().getElementAt(index) instanceof WidgetType == false)
return null;
WidgetType type = (WidgetType)list.getModel().getElementAt(index);
return tooltips.get(type);
}
}
}