package comeon.ui.media; import com.google.common.io.Resources; import comeon.model.Media; import comeon.ui.UI; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.BadLocationException; import java.awt.*; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; final class MediaEditPanel extends JPanel { private static final Logger LOGGER = LoggerFactory.getLogger(MediaEditPanel.class); private static final int TEMPLATE_TAB_INDEX = 0; private static final int RENDERED_TAB_INDEX = 1; private static final long serialVersionUID = 1L; private final JTabbedPane templatesPanel; public MediaEditPanel(final MediaPanels panels) { super(new BorderLayout()); final MediaMetadataPanel metadataPanel = new MediaMetadataPanel(panels); this.add(metadataPanel, BorderLayout.WEST); final JTextArea templateText = new AliasedTextArea(panels.getMedia().getTemplateText()); templateText.getDocument().addDocumentListener(new TemplateListener(panels.getMedia())); final JScrollPane templatePanel = wrap(templateText); final JTextArea renderedTemplate = new AliasedTextArea(panels.getMedia().getRenderedTemplate()); renderedTemplate.getDocument().addDocumentListener(new RenderedTemplateListener(panels.getMedia())); final JScrollPane renderedTemplatePanel = wrap(renderedTemplate); this.templatesPanel = new JTabbedPane(SwingConstants.TOP); templatesPanel.insertTab(UI.BUNDLE.getString("media.tab.template"), new ImageIcon(Resources.getResource("comeon/ui/template_small.png")), templatePanel, null, TEMPLATE_TAB_INDEX); templatesPanel.insertTab(UI.BUNDLE.getString("media.tab.page"), new ImageIcon(Resources.getResource("comeon/ui/rendered_small.png")), renderedTemplatePanel, null, RENDERED_TAB_INDEX); templatesPanel.setSelectedComponent(renderedTemplatePanel); panels.getMedia().addPropertyChangeListener(evt -> { if ("renderedTemplate".equals(evt.getPropertyName()) && !evt.getNewValue().equals(renderedTemplate.getText())) { SwingUtilities.invokeLater(() -> renderedTemplate.setText(evt.getNewValue().toString())); } }); this.add(templatesPanel, BorderLayout.CENTER); } private JScrollPane wrap(final JTextArea area) { return new JScrollPane(area); } private abstract class AbstractTemplateListener implements DocumentListener { private final Media media; protected AbstractTemplateListener(final Media media) { this.media = media; } @Override public void removeUpdate(final DocumentEvent e) { this.update(e); } @Override public void insertUpdate(final DocumentEvent e) { this.update(e); } @Override public final void changedUpdate(final DocumentEvent e) { } private void update(final DocumentEvent e) { try { this.doUpdate(media, getText(e)); } catch (final BadLocationException e1) { LOGGER.warn("Can't update template text", e1); } } private String getText(final DocumentEvent e) throws BadLocationException { return e.getDocument().getText(0, e.getDocument().getLength()); } protected abstract void doUpdate(final Media media, final String text); } private final class TemplateListener extends AbstractTemplateListener { private TemplateListener(final Media media) { super(media); } @Override protected void doUpdate(final Media media, final String text) { media.setTemplateText(text); } } private final class RenderedTemplateListener extends AbstractTemplateListener { private RenderedTemplateListener(final Media media) { super(media); } @Override protected void doUpdate(final Media media, final String text) { media.setRenderedTemplate(text); } } }