diff --git a/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java b/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java index ff9fdb2c3..d07503012 100644 --- a/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java +++ b/src/net/java/sip/communicator/impl/gui/utils/NotificationManager.java @@ -293,6 +293,8 @@ public static void stopSound(String eventType) .getEventNotificationActionHandler( eventType, NotificationService.ACTION_SOUND); - soundHandler.stop(); + // There can be no sound action handler for this event type + if(soundHandler != null) + soundHandler.stop(); } } diff --git a/src/net/java/sip/communicator/impl/notification/CommandNotificationHandlerImpl.java b/src/net/java/sip/communicator/impl/notification/CommandNotificationHandlerImpl.java index 8dff174ae..7ec4c4cf2 100644 --- a/src/net/java/sip/communicator/impl/notification/CommandNotificationHandlerImpl.java +++ b/src/net/java/sip/communicator/impl/notification/CommandNotificationHandlerImpl.java @@ -45,6 +45,9 @@ public CommandNotificationHandlerImpl(String commandDescriptor) */ public void execute() { + if(StringUtils.isNullOrEmpty(commandDescriptor, true)) + return; + try { Runtime.getRuntime().exec(commandDescriptor); diff --git a/src/net/java/sip/communicator/impl/notification/SoundNotificationHandlerImpl.java b/src/net/java/sip/communicator/impl/notification/SoundNotificationHandlerImpl.java index d1f54dff4..34d8e901f 100644 --- a/src/net/java/sip/communicator/impl/notification/SoundNotificationHandlerImpl.java +++ b/src/net/java/sip/communicator/impl/notification/SoundNotificationHandlerImpl.java @@ -8,6 +8,7 @@ import net.java.sip.communicator.service.audionotifier.*; import net.java.sip.communicator.service.notification.*; +import net.java.sip.communicator.util.*; /** * An implementation of the SoundNotificationHandlerImpl interface. @@ -80,7 +81,8 @@ public void start() AudioNotifierService audioNotifService = NotificationActivator.getAudioNotifier(); - if(audioNotifService == null) + if(audioNotifService == null + || StringUtils.isNullOrEmpty(soundFileDescriptor, true)) return; audio = audioNotifService.createAudio(soundFileDescriptor); diff --git a/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationConfigurationPanel.java b/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationConfigurationPanel.java index a3b94d745..92c2949ff 100644 --- a/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationConfigurationPanel.java +++ b/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationConfigurationPanel.java @@ -15,6 +15,7 @@ import javax.swing.event.*; import net.java.sip.communicator.service.audionotifier.*; +import net.java.sip.communicator.service.notification.*; import net.java.sip.communicator.util.*; import net.java.sip.communicator.util.swing.*; @@ -55,6 +56,12 @@ public class NotificationConfigurationPanel private SipCommFileChooser fileChooserProgram; private SipCommFileChooser fileChooserSound; + /** + * Used to suppress saving entry values while filling + * programFileTextField and soundFileTextField. + */ + private boolean isCurrentlyChangeEntryInTable = false; + /** * Creates an instance of NotificationConfigurationPanel. */ @@ -173,6 +180,8 @@ private void initNotificationsList() */ public void setNotificationEntry(NotificationEntry entry) { + isCurrentlyChangeEntryInTable = true; + programFileChooser.setEnabled(entry.getProgram()); programFileTextField.setEnabled(entry.getProgram()); @@ -186,6 +195,8 @@ public void setNotificationEntry(NotificationEntry entry) String soundFile = entry.getSoundFile(); soundFileTextField.setText( (soundFile != null && soundFile.length() > 0) ? soundFile : ""); + + isCurrentlyChangeEntryInTable = false; } /** @@ -292,16 +303,37 @@ else if(e.getSource() == playSoundButton) */ public void insertUpdate(DocumentEvent event) { + // we are just changing display values, no real change in data + // to save it + if(isCurrentlyChangeEntryInTable) + return; + NotificationEntry entry = notificationList.getNotificationEntry( notificationList.getSelectedRow()); if(event.getDocument().equals(programFileTextField.getDocument())) { entry.setProgramFile(programFileTextField.getText()); + + NotificationConfigurationActivator.getNotificationService() + .registerNotificationForEvent( + entry.getEvent(), + NotificationService.ACTION_COMMAND, + entry.getProgramFile(), + "" + ); } if(event.getDocument().equals(soundFileTextField.getDocument())) { entry.setSoundFile(soundFileTextField.getText()); + + NotificationConfigurationActivator.getNotificationService() + .registerNotificationForEvent( + entry.getEvent(), + NotificationService.ACTION_SOUND, + entry.getSoundFile(), + "" + ); } } @@ -311,16 +343,37 @@ public void insertUpdate(DocumentEvent event) */ public void removeUpdate(DocumentEvent event) { + // we are just changing display values, no real change in data + // to save it + if(isCurrentlyChangeEntryInTable) + return; + NotificationEntry entry = notificationList.getNotificationEntry( notificationList.getSelectedRow()); if(event.getDocument().equals(programFileTextField.getDocument())) { entry.setProgramFile(programFileTextField.getText()); + + NotificationConfigurationActivator.getNotificationService() + .registerNotificationForEvent( + entry.getEvent(), + NotificationService.ACTION_COMMAND, + entry.getProgramFile(), + "" + ); } if(event.getDocument().equals(soundFileTextField.getDocument())) { entry.setSoundFile(soundFileTextField.getText()); + + NotificationConfigurationActivator.getNotificationService() + .registerNotificationForEvent( + entry.getEvent(), + NotificationService.ACTION_SOUND, + entry.getSoundFile(), + "" + ); } } diff --git a/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationsTable.java b/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationsTable.java index 59bd8ff33..78b737472 100644 --- a/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationsTable.java +++ b/src/net/java/sip/communicator/plugin/notificationconfiguration/NotificationsTable.java @@ -272,8 +272,7 @@ private NotificationEntry getNotificationEntry(String eventName) { for (int row = 0; row < notifTable.getRowCount(); row++) { - NotificationEntry entry = (NotificationEntry) notifTable - .getValueAt(row, notifTable.getColumnCount() - 1); + NotificationEntry entry = getNotificationEntry(row); if (entry.getEvent() == eventName) return entry; @@ -309,8 +308,7 @@ private int indexOfEntry(NotificationEntry entry) { for (int row = 0; row < notifTable.getRowCount(); row++) { - NotificationEntry e = (NotificationEntry) notifTable - .getValueAt(row, notifTable.getColumnCount() - 1); + NotificationEntry e = getNotificationEntry(row); if (e.equals(entry)) return row; @@ -440,9 +438,8 @@ public void mouseClicked(MouseEvent e) else notifTable.setValueAt(ENABLED, row, col); - NotificationEntry entry = (NotificationEntry) notifTable - .getValueAt(row, notifTable.getColumnCount() - 1); - + NotificationEntry entry = getNotificationEntry(row); + switch(col) { case 0: @@ -460,15 +457,19 @@ public void mouseClicked(MouseEvent e) entry.setProgram(isProgram); if(isProgram) + { notificationService.registerNotificationForEvent( entry.getEvent(), NotificationService.ACTION_COMMAND, entry.getProgramFile(), ""); + } else + { notificationService.removeEventNotificationAction( entry.getEvent(), NotificationService.ACTION_COMMAND); + } break; case 2: boolean isPopup = notifTable.getValueAt(row, 2).equals(ENABLED); @@ -494,17 +495,23 @@ public void mouseClicked(MouseEvent e) entry.setSound(isSound); if (isSound) + { notificationService.registerNotificationForEvent( entry.getEvent(), NotificationService.ACTION_SOUND, entry.getSoundFile(), ""); + } else + { notificationService.removeEventNotificationAction( entry.getEvent(), NotificationService.ACTION_SOUND); + } break; }; + + configPanel.setNotificationEntry(entry); } }