📄 delegate.java
字号:
/* * :tabSize=8:indentSize=8:noTabs=false: * :folding=explicit:collapseFolds=1: * * Delegate.java - A delegate for NSApplication * Copyright (C) 2003 Kris Kopicki * * 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 macos;//{{{ Importsimport com.apple.eawt.*;import com.apple.eio.*;import com.apple.cocoa.application.*;import com.apple.cocoa.foundation.*;import java.util.*;import java.io.File;import javax.swing.*;import org.gjt.sp.jedit.*;import org.gjt.sp.jedit.browser.*;import org.gjt.sp.jedit.gui.*;import org.gjt.sp.jedit.msg.*;import org.gjt.sp.jedit.options.GlobalOptions;import org.gjt.sp.util.Log;//}}}public class Delegate extends ApplicationAdapter{ //{{{ Variables private final NSSelector actionSel = new NSSelector("doAction", new Class[] {}); private List filenames = new LinkedList(); //}}} //{{{ Constructor public Delegate() { if (jEdit.getBooleanProperty("MacOSPlugin.useScreenMenuBar", jEdit.getBooleanProperty("MacOSPlugin.default.useScreenMenuBar")) ) System.setProperty("apple.laf.useScreenMenuBar","true"); else System.setProperty("apple.laf.useScreenMenuBar","false"); } //}}} //{{{ Handlers //{{{ handleAbout() method public void handleAbout(ApplicationEvent event) { event.setHandled(true); new AboutDialog(jEdit.getActiveView()); } //}}} //{{{ handleFileCodes() method public void handleFileCodes(BufferUpdate msg) { Buffer buffer = msg.getBuffer(); // Set type/creator on save if (!buffer.isDirty() && msg.getWhat() == BufferUpdate.DIRTY_CHANGED) { try { FileManager.setFileTypeAndCreator(buffer.getPath(), buffer.getIntegerProperty("MacOSPlugin.type", jEdit.getIntegerProperty("MacOSPlugin.default.type",0)), buffer.getIntegerProperty("MacOSPlugin.creator", jEdit.getIntegerProperty("MacOSPlugin.default.creator",0))); } catch (Exception e) { // Fail silently, since we may be using UFS } } // Add type/creator to local buffer property list on open else if (msg.getWhat() == BufferUpdate.CREATED) { if ("true".equals( jEdit.getProperty("MacOSPlugin.preserveCodes"))) { try { int type = FileManager.getFileType(buffer.getPath()); int creator = FileManager.getFileCreator(buffer.getPath()); if (type != 0) buffer.setIntegerProperty("MacOSPlugin.type",type); if (creator != 0) buffer.setIntegerProperty("MacOSPlugin.creator",creator); } catch (Exception e) { // This will happen when a new file is created } } } } //}}} //{{{ handleOpenFile() method public void handleOpenFile(ApplicationEvent event) { filenames.add(event.getFilename()); event.setHandled(true); } //}}} //{{{ handleOpenFile() method public void handleOpenFile(ViewUpdate msg) { if(msg.getWhat() == ViewUpdate.CREATED) { Iterator i = filenames.iterator(); while (i.hasNext()) jEdit.openFile(msg.getView(),(String)i.next()); MacOSPlugin.started = true; NSApplication app = NSApplication.sharedApplication(); app.setServicesProvider(new Delegate()); } } //}}} //{{{ handlePreferences() method public void handlePreferences(ApplicationEvent event) { event.setHandled(true); new GlobalOptions(jEdit.getActiveView()); } //}}} //{{{ handleQuit() method /** * This never seems to be called when used with a delegate */ //public void handleQuit(ApplicationEvent event) //{ // event.setHandled(false); // jEdit.exit(jEdit.getActiveView(),true); //} //}}} //}}} //{{{ Delegate methods //{{{ applicationDockMenu() method public NSMenu applicationDockMenu(NSApplication sender) { NSMenu dockMenu; BufferMenu bufMenu; MacrosMenu macMenu; RecentMenu recMenu; RecentDirMenu dirMenu; NSMenuItem showCurrItem; NSMenuItem showCurrDirItem; NSMenuItem newViewItem; // Buffers NSMenuItem miBuff = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.buffers.label"),null,""); miBuff.setSubmenu(bufMenu = new BufferMenu()); // Recent Buffers NSMenuItem miRec = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.recent.label"),null,""); miRec.setSubmenu(recMenu = new RecentMenu()); // Recent Directories NSMenuItem miDir = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.recentDir.label"),null,""); miDir.setSubmenu(dirMenu = new RecentDirMenu()); // Macros NSMenuItem miMac = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.macros.label"),null,""); miMac.setSubmenu(macMenu = new MacrosMenu()); dockMenu = new NSMenu(); newViewItem = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.newView"),actionSel,""); newViewItem.setTarget(new NewViewAction()); dockMenu.addItem(newViewItem); dockMenu.addItem(new NSMenuItem().separatorItem()); showCurrItem = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.showCurrent"),actionSel,""); dockMenu.addItem(showCurrItem); showCurrDirItem = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.showCurrentDir"),actionSel,""); dockMenu.addItem(showCurrDirItem); dockMenu.addItem(new NSMenuItem().separatorItem()); dockMenu.addItem(miBuff); dockMenu.addItem(miRec); dockMenu.addItem(miDir); //dockMenu.addItem(new NSMenuItem().separatorItem()); //dockMenu.addItem(miMac); if (jEdit.getViewCount() == 0) miMac.setEnabled(false); bufMenu.updateMenu(); recMenu.updateMenu(); dirMenu.updateMenu(); macMenu.updateMenu(); View view = jEdit.getActiveView(); if (view != null) { File buff = new File(view.getBuffer().getPath()); if (buff.exists()) { showCurrItem.setTarget(new ShowFileAction(buff.getPath())); showCurrDirItem.setTarget(new ShowFileAction(buff.getParent())); } } else { showCurrItem.setEnabled(false); showCurrDirItem.setEnabled(false); } return dockMenu; } //}}} //{{{ applicationOpenFiles() method public void applicationOpenFiles(NSApplication sender, NSArray filenames) { int count = filenames.count(); for (int i=0; i<count; i++) { File file = new File((String)filenames.objectAtIndex(i)); Buffer buffer; View view = jEdit.getActiveView(); if(view == null) view = PerspectiveManager.loadPerspective(true); if (file.isDirectory()) { VFSBrowser.browseDirectory(jEdit.getActiveView(),file.getPath()); return; } if (jEdit.openFile(view,file.getPath()) == null) Log.log(Log.ERROR,this,"Error opening file."); } } //}}} //{{{ applicationShouldHandleReopen() method public boolean applicationShouldHandleReopen(NSApplication theApplication, boolean flag) { SwingUtilities.invokeLater(new Runnable() { public void run() { if (jEdit.getViewCount() == 0) new NewViewAction().doAction(); } }); return false; } //}}} //{{{ applicationShouldTerminate() method public boolean applicationShouldTerminate(NSApplication sender) { SwingUtilities.invokeLater(new Runnable() { public void run() { jEdit.exit(jEdit.getActiveView(),true); } }); return false; } //}}} //}}} //{{{ Services //{{{ openFile() method public String openFile(NSPasteboard pboard, String userData) { if (jEdit.getViewCount() == 0) return null; NSData data = pboard.dataForType("NSFilenamesPboardType"); String[] error = new String[1]; int[] format = new int[1]; NSArray filenames = (NSArray)NSPropertyListSerialization.propertyListFromData(data, NSPropertyListSerialization.PropertyListImmutable, format, error); int count = filenames.count(); for (int i=0; i<count; i++) { File file = new File((String)filenames.objectAtIndex(i)); if (file.isDirectory()) VFSBrowser.browseDirectory(jEdit.getActiveView(),file.getPath()); else jEdit.openFile(jEdit.getActiveView(),file.getPath()); } return null; } //}}} //{{{ insertSelection() method public String insertSelection(NSPasteboard pboard, String userData) { String string = pboard.stringForType("NSStringPboardType"); if (jEdit.getViewCount() > 0) { View view = jEdit.getActiveView(); view.getBuffer().insert(view.getTextArea().getCaretPosition(),string); } return null; } //}}} //{{{ openSelection() method public String openSelection(NSPasteboard pboard, String userData) { String string = pboard.stringForType("NSStringPboardType"); if (jEdit.getViewCount() == 0) new NewViewAction().doAction(); jEdit.newFile(jEdit.getActiveView()).insert(0,pboard.stringForType("NSStringPboardType")); return null; } //}}} //}}} //{{{ Dock Menu //{{{ BufferMenu class class BufferMenu extends NSMenu { public BufferMenu() { super(); } public void updateMenu() { NSMenuItem item; for (int i=0; i<numberOfItems(); i++) removeItemAtIndex(0); Buffer[] buffs = jEdit.getBuffers(); for (int i=0; i < buffs.length; i++) { if (!buffs[i].isUntitled()) { item = new NSMenuItem(buffs[i].getName(),actionSel,""); item.setTarget(new ShowFileAction(buffs[i].getPath())); //item.setImage(NSWorkspace.sharedWorkspace().iconForFile( // buffs[i].getPath())); if (!new File(buffs[i].getPath()).exists()) item.setEnabled(false); addItem(item); } } if (numberOfItems() == 0) { item = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.buffers.none"),null,""); item.setEnabled(false); addItem(item); } } } //}}} //{{{ MacrosMenu class class MacrosMenu extends NSMenu { public MacrosMenu() { super(); } public void updateMenu() { Vector macroVector = Macros.getMacroHierarchy(); NSMenuItem item; File file; int max = macroVector.size(); int length = numberOfItems(); for (int i=0; i<length; i++) removeItemAtIndex(0); if (max == 0) { item = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.macros.none"),null,""); item.setEnabled(false); addItem(item); return; } createMenu(this,macroVector); } public void createMenu(NSMenu menu, Vector vector) { for(int i=0; i < vector.size(); i++) { Object obj = vector.elementAt(i); if(obj instanceof Macros.Macro) { Macros.Macro macro = (Macros.Macro)obj; NSMenuItem item = new NSMenuItem(macro.getLabel(),actionSel,""); item.setTarget(new MacroAction(macro)); menu.addItem(item); } else if(obj instanceof Vector) { Vector subvector = (Vector)obj; String name = (String)subvector.elementAt(0); NSMenu submenu = new NSMenu(); createMenu(submenu,subvector); if(submenu.numberOfItems() > 0) { NSMenuItem submenuitem = new NSMenuItem(name,null,""); submenuitem.setSubmenu(submenu); menu.addItem(submenuitem); } } } } } //}}} //{{{ RecentMenu class class RecentMenu extends NSMenu { public RecentMenu() { super(); } public void updateMenu() { List recent = BufferHistory.getHistory(); NSMenuItem item; File file; int max = recent.size(); int min = max - 20; int length = numberOfItems(); for (int i=0; i<length; i++) removeItemAtIndex(0); if (max == 0) { item = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.recent.none"),null,""); item.setEnabled(false); addItem(item); return; } if (min < 0) min = 0; for (int i=max-1; i >= min ; i--) { file = new File(((BufferHistory.Entry)recent.get(i)).path); item = new NSMenuItem(file.getName(),actionSel,""); item.setTarget(new ShowFileAction(file.getPath())); if (!file.exists()) item.setEnabled(false); addItem(item); } } } //}}} //{{{ RecentDirMenu class class RecentDirMenu extends NSMenu { public RecentDirMenu() { super(); } public void updateMenu() { HistoryModel model = HistoryModel.getModel("vfs.browser.path"); NSMenuItem item; File file; int max = model.getSize(); int length = numberOfItems(); for (int i=0; i<length; i++) removeItemAtIndex(0); if (max == 0) { item = new NSMenuItem(jEdit.getProperty("MacOSPlugin.menu.recentDir.none"),null,""); item.setEnabled(false); addItem(item); return; } for (int i=0; i < max ; i++) { file = new File(model.getItem(i)); item = new NSMenuItem(file.getName(),actionSel,""); item.setTarget(new ShowFileAction(file.getPath())); if (!file.exists()) item.setEnabled(false); addItem(item); } } } //}}} //{{{ MacroAction class class MacroAction { private Macros.Macro macro; public MacroAction(Macros.Macro macro) { this.macro = macro; } public void doAction() { macro.invoke(jEdit.getActiveView()); } } //}}} //{{{ NewViewAction class class NewViewAction { public void doAction() { SwingUtilities.invokeLater(new Runnable() { public void run() { if (jEdit.getViewCount() == 0) PerspectiveManager.loadPerspective(true); else jEdit.newView(jEdit.getActiveView()); } }); } } //}}} //{{{ ShowFileAction class class ShowFileAction { private String path; public ShowFileAction(String path) { this.path = path; } public void doAction() { MacOSActions.showInFinder(path); } } //}}} //}}}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -