package com.vistatec.ocelot; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.eventbus.Subscribe; import com.vistatec.ocelot.config.ConfigTransferService.TransferException; import com.vistatec.ocelot.config.LqiConfigService; import com.vistatec.ocelot.events.LQIDeselectionEvent; import com.vistatec.ocelot.events.LQISelectionEvent; import com.vistatec.ocelot.events.SegmentEditEvent; import com.vistatec.ocelot.events.SegmentSelectionEvent; import com.vistatec.ocelot.events.SegmentTargetResetEvent; import com.vistatec.ocelot.events.api.OcelotEventQueue; import com.vistatec.ocelot.events.api.OcelotEventQueueListener; import com.vistatec.ocelot.its.model.LanguageQualityIssue; import com.vistatec.ocelot.its.view.LanguageQualityIssuePropsPanel; import com.vistatec.ocelot.segment.model.OcelotSegment; import com.vistatec.ocelot.xliff.XLIFFDocument; public class SegmentMenu implements OcelotEventQueueListener { private static final Logger LOG = LoggerFactory.getLogger(SegmentMenu.class); private JMenu menu; private JMenuItem menuAddIssue, menuRemoveIssue, menuRestoreTarget; private OcelotSegment selectedSegment; private XLIFFDocument xliff; private LanguageQualityIssue selectedLQI; private LanguageQualityIssuePropsPanel addLQIView = null; public SegmentMenu(final OcelotEventQueue eventQueue, int platformKeyMask, final LqiConfigService lqiService) { menu = new JMenu("Segment"); menuAddIssue = new JMenuItem("Add Issue"); menuAddIssue.setAccelerator( KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, platformKeyMask)); menuAddIssue.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { /** * This is a gross workaround for a bizarre bug in the 1.7 Mac * JRE, which results in the VK_EQUALS key event being sent * 3 separate times. In order to prevent 3 separate dialogs * from opening, we trap the extraneous events. * This seems to be fixed in the 1.8 runtime. See OC-41 for more. */ if (addLQIView == null) { try { addLQIView = new LanguageQualityIssuePropsPanel(eventQueue, lqiService.readLQIConfig()); addLQIView.setWindowListener(new AddLQIViewWindowListener()); addLQIView.setSegment(selectedSegment); SwingUtilities.invokeLater(addLQIView); } catch (TransferException e1) { LOG.warn("Unable to parse LQI configuration: {}", e1.getMessage()); } } } }); menuAddIssue.setEnabled(false); menu.add(menuAddIssue); menuRemoveIssue = new JMenuItem("Remove Issue"); menuRemoveIssue.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { selectedSegment.removeLQI(selectedLQI); } }); menuRemoveIssue.setEnabled(false); menu.add(menuRemoveIssue); menuRestoreTarget = new JMenuItem("Reset Target"); menuRestoreTarget.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { eventQueue.post(new SegmentTargetResetEvent(xliff, selectedSegment)); } }); menuRestoreTarget.setEnabled(false); menu.add(menuRestoreTarget); } class AddLQIViewWindowListener extends WindowAdapter { @Override public void windowClosed(WindowEvent e) { addLQIView = null; } } @Subscribe public void selectedSegment(SegmentSelectionEvent e) { menuAddIssue.setEnabled(true); menuRemoveIssue.setEnabled(false); menuRestoreTarget.setEnabled(e.getSegment().hasOriginalTarget()); this.selectedSegment = e.getSegment(); this.xliff = e.getDocument(); } @Subscribe public void segmentEdited(SegmentEditEvent e) { OcelotSegment seg = e.getSegment(); if (seg.equals(selectedSegment)) { menuRestoreTarget.setEnabled(seg.hasOriginalTarget() && seg.getTarget().getDisplayText().equals( seg.getOriginalTarget().getDisplayText())); } } @Subscribe public void selectedLQI(LQISelectionEvent e) { menuRemoveIssue.setEnabled(e.getLQI() != null); this.selectedLQI = e.getLQI(); } @Subscribe public void deselectedLQI(LQIDeselectionEvent e) { selectedLQI = null; menuRemoveIssue.setEnabled(false); } public JMenu getMenu() { return menu; } }