package org.fandev.module; import com.intellij.openapi.vfs.*; import com.intellij.openapi.module.Module; import com.intellij.openapi.util.Key; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.fileEditor.FileEditor; import com.intellij.openapi.application.ApplicationManager; import com.intellij.ui.LightColors; import org.fandev.lang.fan.FanBundle; import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; /** * @author Dror Bereznitsky * @date Feb 23, 2009 11:18:52 PM */ public class ModuleSynchFileListener extends VirtualFileAdapter { private VirtualFile listeningTo; private Module module; private static final Key<JComponent> PANEL_KEY = new Key<JComponent>("ModuleSynchFileListener"); public ModuleSynchFileListener(final VirtualFile podFile, final Module module) { this.listeningTo = podFile; this.module = module; } @Override public void contentsChanged(final VirtualFileEvent virtualFileEvent) { if (virtualFileEvent.getFile().equals(listeningTo)) { for (final FileEditor e : getFileEditorManager().getEditors(listeningTo)) { if (e.getUserData(PANEL_KEY) != null){ continue; } final JComponent panel = createNotifierPanel(); e.putUserData(PANEL_KEY, panel); getFileEditorManager().addTopComponent(e, panel); } } } private JComponent createNotifierPanel() { final JPanel panel =new JPanel(new BorderLayout()); panel.setBackground(LightColors.YELLOW); panel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 4)); final JButton button = new JButton(FanBundle.message("button.synchronize")); panel.add(new JLabel(FanBundle.message("pod.build.file.changed")), BorderLayout.WEST); panel.add(button, BorderLayout.EAST); button.addActionListener(new ActionListener() { public void actionPerformed(final ActionEvent e) { ApplicationManager.getApplication().runWriteAction(new Runnable() { public void run() { synchModule(); } }); } }); return panel; } private void synchModule() { try { FanModuleSettings.getInstance(module).synchModule(); } finally { resetNotificationPanel(); } } private void resetNotificationPanel() { for (final FileEditor e : getFileEditorManager().getEditors(listeningTo)) { final JComponent panel = e.getUserData(PANEL_KEY); if (panel == null) { continue; } getFileEditorManager().removeTopComponent(e, panel); e.putUserData(PANEL_KEY, null); } } private FileEditorManager getFileEditorManager() { return FileEditorManager.getInstance(module.getProject()); } }