From: <kp...@us...> - 2011-08-04 13:21:03
|
Revision: 19749 http://jedit.svn.sourceforge.net/jedit/?rev=19749&view=rev Author: kpouer Date: 2011-08-04 13:20:56 +0000 (Thu, 04 Aug 2011) Log Message: ----------- Added an option for the systray icon in general option pane and use if a JPopupMenu, more customizable Modified Paths: -------------- jEdit/trunk/org/gjt/sp/jedit/jEdit.java jEdit/trunk/org/gjt/sp/jedit/jedit_gui.props jEdit/trunk/org/gjt/sp/jedit/options/GeneralOptionPane.java Added Paths: ----------- jEdit/trunk/org/gjt/sp/jedit/gui/tray/ jEdit/trunk/org/gjt/sp/jedit/gui/tray/JEditTrayIcon.java jEdit/trunk/org/gjt/sp/jedit/gui/tray/JTrayIcon.java Added: jEdit/trunk/org/gjt/sp/jedit/gui/tray/JEditTrayIcon.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/gui/tray/JEditTrayIcon.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/gui/tray/JEditTrayIcon.java 2011-08-04 13:20:56 UTC (rev 19749) @@ -0,0 +1,178 @@ +/* + * jEdit - Programmer's Text Editor + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright © 2011 Matthieu Casanova + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.gjt.sp.jedit.gui.tray; + +import org.gjt.sp.jedit.EditServer; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.jEdit; +import org.gjt.sp.util.Log; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.HashMap; +import java.util.Map; + +/** + * @author Matthieu Casanova + * @since jEdit 4.5pre1 + */ +public class JEditTrayIcon extends JTrayIcon +{ + private static JEditTrayIcon trayIcon; + private static boolean restore; + private static String userDir; + private static String[] args; + + private JEditTrayIcon() + { + super(GUIUtilities.getEditorIcon(), "jEdit"); + setImageAutoSize(true); + JPopupMenu popup = new JPopupMenu(); + JMenuItem newViewItem = new JMenuItem(jEdit.getProperty("tray.newView.label")); + JMenuItem newPlainViewItem = new JMenuItem(jEdit.getProperty("tray.newPlainView.label")); + JMenuItem exitItem = new JMenuItem(jEdit.getProperty("tray.exit.label")); + + popup.add(newViewItem); + popup.add(newPlainViewItem); + popup.addSeparator(); + popup.add(exitItem); + ActionListener actionListener = new MyActionListener(newViewItem, newPlainViewItem, exitItem); + newViewItem.addActionListener(actionListener); + newPlainViewItem.addActionListener(actionListener); + exitItem.addActionListener(actionListener); + setMenu(popup); + + addMouseListener(new MyMouseAdapter()); + } + + public static void setTrayIconArgs(boolean restore, String userDir, String[] args) + { + JEditTrayIcon.restore = restore; + JEditTrayIcon.userDir = userDir; + JEditTrayIcon.args = args; + } + + public static void addTrayIcon() + { + if (trayIcon == null && SystemTray.isSupported()) + { + + SystemTray systemTray = SystemTray.getSystemTray(); + + trayIcon = new JEditTrayIcon(); + + try + { + systemTray.add(trayIcon); + } + catch (AWTException e) + { + Log.log(Log.ERROR, JEditTrayIcon.class, "Unable to add Tray icon", e); + } + } + } + + public static void removeTrayIcon() + { + if (trayIcon != null) + { + SystemTray.getSystemTray().remove(trayIcon); + trayIcon = null; + } + } + + private static class MyMouseAdapter extends MouseAdapter + { + private final Map<Window,Boolean> windowState = new HashMap<Window, Boolean>(); + + @Override + public void mouseClicked(MouseEvent e) + { + if (e.getButton() != MouseEvent.BUTTON1) + return; + if (jEdit.getViewCount() == 0) + { + EditServer.handleClient(restore, true, false, userDir, args); + } + else + { + boolean newVisibilityState = !jEdit.getActiveView().isVisible(); + if (newVisibilityState) + { + for (Window window : Window.getWindows()) + { + Boolean previousState = windowState.get(window); + if (previousState == null) + window.setVisible(true); + else if (previousState) + window.setVisible(previousState); + } + windowState.clear(); + if (jEdit.getActiveView().getState() == Frame.ICONIFIED) + jEdit.getActiveView().setState(Frame.NORMAL); + jEdit.getActiveView().toFront(); + } + else + { + for (Window window : Window.getWindows()) + { + windowState.put(window, window.isVisible()); + window.setVisible(false); + } + } + } + } + } + + private static class MyActionListener implements ActionListener + { + private final JMenuItem newViewItem; + private final JMenuItem newPlainViewItem; + private final JMenuItem exitItem; + + MyActionListener(JMenuItem newViewItem, JMenuItem newPlainViewItem, JMenuItem exitItem) + { + this.newViewItem = newViewItem; + this.newPlainViewItem = newPlainViewItem; + this.exitItem = exitItem; + } + + @Override + public void actionPerformed(ActionEvent e) + { + if (e.getSource() == newViewItem) + { + jEdit.newView(null); + } else if (e.getSource() == newPlainViewItem) + { + jEdit.newView(null, null, true); + } else if (e.getSource() == exitItem) + { + jEdit.exit(null, true); + } + } + } +} Added: jEdit/trunk/org/gjt/sp/jedit/gui/tray/JTrayIcon.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/gui/tray/JTrayIcon.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/gui/tray/JTrayIcon.java 2011-08-04 13:20:56 UTC (rev 19749) @@ -0,0 +1,119 @@ +/* + * jEdit - Programmer's Text Editor + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright © 2011 Matthieu Casanova + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +package org.gjt.sp.jedit.gui.tray; + +import org.gjt.sp.jedit.GUIUtilities; + +import javax.swing.*; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import java.awt.*; +import java.awt.event.*; + +/** + * @author Matthieu Casanova + */ +public class JTrayIcon extends TrayIcon +{ + private JDialog parent; + private JPopupMenu menu; + private MouseListener mouseListener; + private PopupMenuListener popupMenuListener; + + public JTrayIcon(Image image, String tooltip) + { + super(image, tooltip, null); + + } + + public JPopupMenu getMenu() + { + return menu; + } + + public void setMenu(JPopupMenu menu) + { + if (menu == null) + { + + if (mouseListener != null) + { + removeMouseListener(mouseListener); + mouseListener = null; + } + if (popupMenuListener != null) + { + this.menu.removePopupMenuListener(popupMenuListener); + popupMenuListener = null; + } + parent = null; + } + else + { + parent = new JDialog((Frame) null); + parent.setUndecorated(true); + parent.setAlwaysOnTop(true); + if (mouseListener == null) + { + mouseListener = new MyMouseListener(); + addMouseListener(mouseListener); + } + popupMenuListener = new MyPopupMenuListener(); + menu.addPopupMenuListener(popupMenuListener); + } + this.menu = menu; + } + + private class MyMouseListener extends MouseAdapter + { + @Override + public void mouseClicked(MouseEvent e) + { + if (GUIUtilities.isPopupTrigger(e)) + { + parent.setLocation(e.getX(), e.getY() - menu.getPreferredSize().height); + parent.setVisible(true); + menu.show(parent, 0, 0); + } + } + } + + private class MyPopupMenuListener implements PopupMenuListener + { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) + { + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) + { + parent.setVisible(false); + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) + { + parent.setVisible(false); + } + } +} Modified: jEdit/trunk/org/gjt/sp/jedit/jEdit.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/jEdit.java 2011-08-03 21:25:21 UTC (rev 19748) +++ jEdit/trunk/org/gjt/sp/jedit/jEdit.java 2011-08-04 13:20:56 UTC (rev 19749) @@ -23,6 +23,7 @@ //{{{ Imports import org.gjt.sp.jedit.datatransfer.JEditTransferableService; +import org.gjt.sp.jedit.gui.tray.JEditTrayIcon; import org.gjt.sp.jedit.visitors.JEditVisitor; import java.awt.*; @@ -459,6 +460,7 @@ KillRing.setInstance(new JEditKillRing()); KillRing.getInstance().load(); GUIUtilities.advanceSplashProgress("init various properties"); + JEditTrayIcon.setTrayIconArgs(restore, userDir, args); propertiesChanged(); GUIUtilities.advanceSplashProgress("init modes"); @@ -952,6 +954,14 @@ KillRing.getInstance().propertiesChanged(getIntegerProperty("history",25)); Chunk.propertiesChanged(propertyManager); + if (jEdit.getBooleanProperty("systrayicon")) + { + JEditTrayIcon.addTrayIcon(); + } + else + { + JEditTrayIcon.removeTrayIcon(); + } EditBus.send(new PropertiesChanged(null)); } //}}} @@ -3847,103 +3857,10 @@ // -nogui -nobackground switches on command // line) Toolkit.getDefaultToolkit(); - addSystemTrayIcon(restore, userDir, args); } }); } //}}} - private static void addSystemTrayIcon(final boolean restore, final String userDir, final String[] args) - { - if (SystemTray.isSupported()) - { - SystemTray systemTray = SystemTray.getSystemTray(); - Image editorIcon = ((ImageIcon) GUIUtilities.loadIcon(jEdit.getProperty("logo.icon.small"))).getImage(); - - PopupMenu popup = new PopupMenu(); - final MenuItem newViewItem = new MenuItem(jEdit.getProperty("tray.newView.label")); - final MenuItem newPlainViewItem = new MenuItem(jEdit.getProperty("tray.newPlainView.label")); - final MenuItem exitItem = new MenuItem(jEdit.getProperty("tray.exit.label")); - - popup.add(newViewItem); - popup.add(newPlainViewItem); - popup.addSeparator(); - popup.add(exitItem); - ActionListener actionListener = new ActionListener() - { - @Override - public void actionPerformed(ActionEvent e) - { - if (e.getSource() == newViewItem) - { - jEdit.newView(null); - } - else if (e.getSource() == newPlainViewItem) - { - jEdit.newView(null,null,true); - } - else if (e.getSource() == exitItem) - { - jEdit.exit(null, true); - } - } - }; - newViewItem.addActionListener(actionListener); - newPlainViewItem.addActionListener(actionListener); - exitItem.addActionListener(actionListener); - TrayIcon trayIcon = new TrayIcon(editorIcon, "jEdit", popup); - trayIcon.addMouseListener(new MouseAdapter() - { - private final Map<Window,Boolean> windowState = new HashMap<Window, Boolean>(); - @Override - public void mouseClicked(MouseEvent e) - { - if (e.getButton() != MouseEvent.BUTTON1) - return; - if (jEdit.getViewCount() == 0) - { - EditServer.handleClient(restore, true, false, userDir, args); - } - else - { - boolean newVisibilityState = !jEdit.getActiveView().isVisible(); - if (newVisibilityState) - { - for (Window window : Window.getWindows()) - { - Boolean previousState = windowState.get(window); - if (previousState == null) - window.setVisible(true); - else if (previousState) - window.setVisible(previousState); - } - windowState.clear(); - if (jEdit.getActiveView().getState() == Frame.ICONIFIED) - jEdit.getActiveView().setState(Frame.NORMAL); - jEdit.getActiveView().toFront(); - } - else - { - for (Window window : Window.getWindows()) - { - windowState.put(window, window.isVisible()); - window.setVisible(false); - } - } - } - } - }); - trayIcon.setImageAutoSize(true); - try - { - systemTray.add(trayIcon); - } - catch (AWTException e) - { - Log.log(Log.ERROR, jEdit.class, e, e); - } - } - } - //{{{ showPluginErrorDialog() method private static void showPluginErrorDialog() { Modified: jEdit/trunk/org/gjt/sp/jedit/jedit_gui.props =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/jedit_gui.props 2011-08-03 21:25:21 UTC (rev 19748) +++ jEdit/trunk/org/gjt/sp/jedit/jedit_gui.props 2011-08-04 13:20:56 UTC (rev 19749) @@ -184,6 +184,7 @@ #}}} #{{{ System tray menu +systrayicon=true tray.newView.label=New view tray.newPlainView.label=New plain view tray.exit.label=Exit @@ -1852,6 +1853,7 @@ options.general.encodingDetectors=List of encoding autodetectors: options.general.fallbackEncodings=List of fallback encodings: options.general.fallbackEncodings.tooltip=A whitespace-separated list of encodings to try against encoding errors on loading +options.general.systrayicon=Show the systray icon #}}} #{{{ Abbreviations pane Modified: jEdit/trunk/org/gjt/sp/jedit/options/GeneralOptionPane.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/options/GeneralOptionPane.java 2011-08-03 21:25:21 UTC (rev 19748) +++ jEdit/trunk/org/gjt/sp/jedit/options/GeneralOptionPane.java 2011-08-04 13:20:56 UTC (rev 19749) @@ -67,6 +67,7 @@ private JCheckBox restoreRemote; private JCheckBox restoreCLI; private JCheckBox restoreSplits; + private JCheckBox systemTrayIcon; //}}} //{{{ GeneralOptionPane constructor @@ -179,6 +180,11 @@ restoreSplits.setSelected(jEdit.getBooleanProperty("restore.splits", true)); addComponent(restoreSplits); + systemTrayIcon = new JCheckBox(jEdit.getProperty( + "options.general.systrayicon", "Show the systray icon")); + systemTrayIcon.setSelected(jEdit.getBooleanProperty("systrayicon", true)); + addComponent(systemTrayIcon); + hypersearchResultsWarning = new JTextField(jEdit.getProperty("hypersearch.maxWarningResults")); addComponent(jEdit.getProperty("options.general.hypersearch.maxWarningResults"), hypersearchResultsWarning); @@ -221,6 +227,7 @@ jEdit.setBooleanProperty("restore.cli",restoreCLI.isSelected()); jEdit.setBooleanProperty("restore.remote", restoreRemote.isSelected()); jEdit.setBooleanProperty("restore.splits", restoreSplits.isSelected()); + jEdit.setBooleanProperty("systrayicon", systemTrayIcon.isSelected()); try { jEdit.setIntegerProperty("hypersearch.maxWarningResults", Integer.parseInt(hypersearchResultsWarning.getText())); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |