/* * jEdit - Programmer's Text Editor * :tabSize=4:indentSize=4:noTabs=false: * :folding=explicit:collapseFolds=1: * * Copyright © 2011 jEdit contributors * * 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; //{{{ Imports import java.awt.Frame; import java.awt.Window; 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; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import org.gjt.sp.jedit.EBComponent; import org.gjt.sp.jedit.EBMessage; import org.gjt.sp.jedit.EditServer; import org.gjt.sp.jedit.GUIUtilities; import org.gjt.sp.jedit.View; import org.gjt.sp.jedit.jEdit; import org.gjt.sp.jedit.msg.EditPaneUpdate; import org.gjt.sp.util.StringList; //}}} /** * @author Matthieu Casanova * @since jEdit 4.5pre1 */ public class JEditSwingTrayIcon extends JEditTrayIcon implements EBComponent { private boolean restore; private String userDir; private String[] args; //{{{ JEditSwingTrayIcon() constructor public JEditSwingTrayIcon() { 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()); } //}}} @Override /** Update tooltip to reflect the window titles currently available. */ public void handleMessage(EBMessage message) { if (message instanceof EditPaneUpdate && (((EditPaneUpdate)message).getWhat() == EditPaneUpdate.BUFFER_CHANGED)) { StringList sl = new StringList(); for (View v: jEdit.getViews()) sl.add(v.getTitle()); setToolTip(sl.join(" | ")); } } //{{{ setTrayIconArgs() method @Override void setTrayIconArgs(boolean restore, String userDir, String[] args) { this.restore = restore; this.userDir = userDir; this.args = args; } //}}} //{{{ MyMouseAdapter class private 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.getOwnerlessWindows()) { if (skipWindow(window)) continue; 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.getOwnerlessWindows()) { if (skipWindow(window)) continue; windowState.put(window, window.isVisible()); window.setVisible(false); } } } } //{{{ skipWindow method /** * Check if a window is not top level or systray icon * @param window the checked window * @return true if it is not toplevel or systray icon */ private boolean skipWindow(Window window) { if (window.getClass().getName().contains("Tray")) return true; return false; } //}}} } //}}} //{{{ MyActionListener class 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); } } } //}}} }