1 19 20 21 package org.netbeans.core.windows.actions; 22 23 import java.awt.Frame ; 24 import java.awt.Image ; 25 import java.awt.KeyboardFocusManager ; 26 import java.awt.event.ActionEvent ; 27 import java.awt.event.InputEvent ; 28 import java.awt.event.KeyEvent ; 29 import java.beans.PropertyChangeEvent ; 30 import java.beans.PropertyChangeListener ; 31 import java.util.ArrayList ; 32 import java.util.Iterator ; 33 import java.util.List ; 34 import javax.swing.AbstractAction ; 35 import javax.swing.ImageIcon ; 36 import javax.swing.KeyStroke ; 37 import org.netbeans.core.windows.Constants; 38 import org.netbeans.core.windows.ModeImpl; 39 import org.netbeans.core.windows.WindowManagerImpl; 40 import org.netbeans.core.windows.view.ui.KeyboardPopupSwitcher; 41 import org.netbeans.swing.popupswitcher.SwitcherTableItem; 42 import org.openide.util.NbBundle; 43 import org.openide.util.Utilities; 44 import org.openide.util.WeakListeners; 45 import org.openide.windows.TopComponent; 46 import org.openide.windows.WindowManager; 47 48 53 public final class RecentViewListAction extends AbstractAction 54 implements PropertyChangeListener { 55 56 57 public RecentViewListAction() { 58 putValue(NAME, NbBundle.getMessage(RecentViewListAction.class, "CTL_RecentViewListAction")); 59 TopComponent.getRegistry().addPropertyChangeListener( 60 WeakListeners.propertyChange(this, TopComponent.getRegistry())); 61 updateEnabled(); 62 } 63 64 public void actionPerformed(ActionEvent evt) { 65 TopComponent[] documents = getRecentDocuments(); 66 67 if (documents.length < 2) { 68 return; 69 } 70 71 if(!"immediately".equals(evt.getActionCommand()) && !(evt.getSource() instanceof javax.swing.JMenuItem )) { 73 KeyStroke keyStroke = Utilities.stringToKey(evt.getActionCommand()); 75 76 if(keyStroke != null) { 77 int triggerKey = keyStroke.getKeyCode(); 78 int reverseKey = KeyEvent.VK_SHIFT; 79 int releaseKey = 0; 80 81 int modifiers = keyStroke.getModifiers(); 82 if((InputEvent.CTRL_MASK & modifiers) != 0) { 83 releaseKey = KeyEvent.VK_CONTROL; 84 } else if((InputEvent.ALT_MASK & modifiers) != 0) { 85 releaseKey = KeyEvent.VK_ALT; 86 } else if((InputEvent.META_MASK & modifiers) != 0) { 87 releaseKey = InputEvent.META_MASK; 88 } 89 90 if(releaseKey != 0) { 91 if (!KeyboardPopupSwitcher.isShown()) { 92 Frame owner = KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() 93 instanceof Frame ? 94 (Frame ) KeyboardFocusManager.getCurrentKeyboardFocusManager().getActiveWindow() 95 : WindowManager.getDefault().getMainWindow(); 96 KeyboardPopupSwitcher.selectItem( 97 createSwitcherItems(documents), 98 releaseKey, triggerKey); 99 } 100 return; 101 } 102 } 103 } 104 105 TopComponent tc = documents[1]; 106 WindowManagerImpl wm = WindowManagerImpl.getInstance(); 108 ModeImpl mode = (ModeImpl) wm.findMode(tc); 109 if(mode != null && mode != wm.getCurrentMaximizedMode()) { 110 wm.switchMaximizedMode(null); 111 } 112 113 tc.requestActive(); 114 } 115 116 private SwitcherTableItem[] createSwitcherItems(TopComponent[] tcs) { 117 SwitcherTableItem[] items = new SwitcherTableItem[tcs.length]; 118 for (int i = 0; i < tcs.length; i++) { 119 TopComponent tc = tcs[i]; 120 String name = tc.getDisplayName(); 121 if (name == null || name.trim().length() == 0) { 122 name = tc.getName(); 123 } 124 String htmlName = tc.getHtmlDisplayName(); 125 if (htmlName == null) { 126 htmlName = name; 127 } 128 Image image = tc.getIcon(); 129 String description = tc.getToolTipText(); 130 ImageIcon imageIcon = (image != null ? new ImageIcon (image) : null); 131 items[i] = new SwitcherTableItem( 132 new ActivatableTC(tc), 133 name, 134 htmlName, 135 imageIcon, 136 false, 137 description != null ? description : name); 138 } 139 return items; 140 } 141 142 private class ActivatableTC implements SwitcherTableItem.Activatable { 143 private TopComponent tc; 144 private ActivatableTC(TopComponent tc) { 145 this.tc = tc; 146 } 147 public void activate() { 148 if (tc != null) { 149 tc.requestActive(); 150 } 151 } 152 } 153 154 155 public void propertyChange(PropertyChangeEvent evt) { 156 if(TopComponent.Registry.PROP_OPENED.equals(evt.getPropertyName())) { 157 updateEnabled(); 158 } 159 } 160 161 167 public static String getStringRep4Unixes() { 168 if (Utilities.isUnix()) { 169 return "Actions/Window/org-netbeans-core-windows-actions-RecentViewListAction.instance"; } 171 return null; 172 } 173 174 177 private void updateEnabled() { 178 setEnabled(isMoreThanOneDocOpened()); 179 } 180 181 private boolean isMoreThanOneDocOpened() { 182 for(Iterator it = WindowManagerImpl.getInstance().getModes().iterator(); it.hasNext(); ) { 183 ModeImpl mode = (ModeImpl)it.next(); { 184 if (mode.getKind() == Constants.MODE_KIND_EDITOR) 185 return (mode.getOpenedTopComponents().size() > 1); 186 } 187 } 188 return false; 189 } 190 191 private TopComponent[] getRecentDocuments() { 192 WindowManagerImpl wm = WindowManagerImpl.getInstance(); 193 TopComponent[] documents = wm.getRecentViewList(); 194 195 List <TopComponent> docsList = new ArrayList <TopComponent>(); 196 for (int i = 0; i < documents.length; i++) { 197 TopComponent tc = documents[i]; 198 if (tc == null) { 199 continue; 200 } 201 ModeImpl mode = (ModeImpl)wm.findMode(tc); 202 if (mode == null) { 203 continue; 204 } 205 206 if (mode.getKind() == Constants.MODE_KIND_EDITOR) { 207 docsList.add(tc); 208 } 209 } 210 return docsList.toArray(new TopComponent[0]); 211 } 212 } 213 214 | Popular Tags |