Skip to content

Commit

Permalink
Fix #3799.
Browse files Browse the repository at this point in the history
  • Loading branch information
dkocher committed Nov 17, 2009
1 parent 8b94764 commit ddfabef
Show file tree
Hide file tree
Showing 8 changed files with 88 additions and 19 deletions.
5 changes: 5 additions & 0 deletions source/ch/cyberduck/ui/cocoa/CDMainController.java
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ public void columnMenuClicked(final NSMenuItem sender) {

public void setEditMenu(NSMenu editMenu) {
this.editMenu = editMenu;
this.editMenu.setAutoenablesItems(false);
this.editMenuDelegate = new EditMenuDelegate();
this.editMenu.setDelegate(editMenuDelegate.id());
}
Expand All @@ -177,6 +178,7 @@ public void setEditMenu(NSMenu editMenu) {

public void setArchiveMenu(NSMenu archiveMenu) {
this.archiveMenu = archiveMenu;
this.archiveMenu.setAutoenablesItems(false);
this.archiveMenuDelegate = new ArchiveMenuDelegate();
this.archiveMenu.setDelegate(archiveMenuDelegate.id());
}
Expand All @@ -187,6 +189,7 @@ public void setArchiveMenu(NSMenu archiveMenu) {

public void setBookmarkMenu(NSMenu bookmarkMenu) {
this.bookmarkMenu = bookmarkMenu;
this.bookmarkMenu.setAutoenablesItems(false);
this.bookmarkMenuDelegate = new BookmarkMenuDelegate();
this.bookmarkMenu.setDelegate(bookmarkMenuDelegate.id());
}
Expand All @@ -197,6 +200,7 @@ public void setBookmarkMenu(NSMenu bookmarkMenu) {

public void setHistoryMenu(NSMenu historyMenu) {
this.historyMenu = historyMenu;
this.historyMenu.setAutoenablesItems(false);
this.historyMenuDelegate = new HistoryMenuDelegate();
this.historyMenu.setDelegate(historyMenuDelegate.id());
}
Expand All @@ -207,6 +211,7 @@ public void setHistoryMenu(NSMenu historyMenu) {

public void setRendezvousMenu(NSMenu rendezvousMenu) {
this.rendezvousMenu = rendezvousMenu;
this.rendezvousMenu.setAutoenablesItems(false);
this.rendezvousMenuDelegate = new RendezvousMenuDelegate();
this.rendezvousMenu.setDelegate(rendezvousMenuDelegate.id());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
final Archive archive = Archive.getKnownArchives()[index.intValue()];
item.setRepresentedObject(archive.getIdentifier());
item.setTitle(archive.getIdentifier());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import ch.cyberduck.ui.cocoa.CDMainController;
import ch.cyberduck.ui.cocoa.application.NSMenu;
import ch.cyberduck.ui.cocoa.application.NSMenuItem;

import org.apache.log4j.Logger;
import org.rococoa.Foundation;
import org.rococoa.cocoa.foundation.NSInteger;
Expand All @@ -43,6 +44,12 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
if(index.intValue() == 6) {
item.setEnabled(true);
item.setImage(CDIconCache.iconNamed("history", 16));
Expand Down
6 changes: 6 additions & 0 deletions source/ch/cyberduck/ui/cocoa/delegate/EditMenuDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
if(EditorFactory.getInstalledOdbEditors().size() == 0) {
item.setTitle(Locale.localizedString("No external editor available"));
return false;
Expand Down
39 changes: 21 additions & 18 deletions source/ch/cyberduck/ui/cocoa/delegate/HistoryMenuDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,38 +47,41 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem sender, NSInteger index, boolean shouldCancel) {
if(HistoryCollection.defaultCollection().size() == 0) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
final int size = HistoryCollection.defaultCollection().size();
if(size == 0) {
sender.setTitle(Locale.localizedString("No recently connected servers available"));
sender.setTarget(null);
sender.setAction(null);
sender.setImage(null);
sender.setEnabled(false);
return false;
}
if(index.intValue() < HistoryCollection.defaultCollection().size()) {
if(index.intValue() < size) {
Host h = HistoryCollection.defaultCollection().get(index.intValue());
// This is a hack. We insert a new NSMenuItem as NSMenu has
// a bug caching old entries since we introduced the separator item below
menu.removeItemAtIndex(index);
NSMenuItem bookmark = menu.insertItemWithTitle_action_keyEquivalent_atIndex(
h.getNickname(), Foundation.selector("historyMenuItemClicked:"), "", index);
bookmark.setRepresentedObject(h.getNickname());
bookmark.setTarget(this.id());
bookmark.setEnabled(true);
bookmark.setImage(CDIconCache.iconNamed(h.getProtocol().icon(), 16));
sender.setTitle(h.getNickname());
sender.setAction(Foundation.selector("historyMenuItemClicked:"));
sender.setRepresentedObject(h.getNickname());
sender.setTarget(this.id());
sender.setEnabled(true);
sender.setImage(CDIconCache.iconNamed(h.getProtocol().icon(), 16));
return !shouldCancel;
}
if(index.intValue() == HistoryCollection.defaultCollection().size()) {
if(index.intValue() == size) {
menu.removeItemAtIndex(index);
menu.insertItem_atIndex(NSMenuItem.separatorItem(), index);
return !shouldCancel;
}
if(index.intValue() == HistoryCollection.defaultCollection().size() + 1) {
menu.removeItemAtIndex(index);
NSMenuItem clear = menu.insertItemWithTitle_action_keyEquivalent_atIndex(Locale.localizedString("Clear Menu"),
Foundation.selector("clearMenuItemClicked:"), "", index);
clear.setTarget(this.id());
clear.setEnabled(true);
if(index.intValue() == size + 1) {
sender.setTitle(Locale.localizedString("Clear Menu"));
sender.setAction(Foundation.selector("clearMenuItemClicked:"));
sender.setTarget(this.id());
sender.setEnabled(true);
return !shouldCancel;
}
return true;
Expand Down
30 changes: 30 additions & 0 deletions source/ch/cyberduck/ui/cocoa/delegate/MenuDelegate.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,14 @@
import ch.cyberduck.ui.cocoa.application.NSMenu;
import ch.cyberduck.ui.cocoa.application.NSMenuItem;

import org.apache.log4j.Logger;
import org.rococoa.cocoa.foundation.NSInteger;

/**
* @version $Id$
*/
public abstract class MenuDelegate extends CDController implements NSMenu.Delegate {
private static Logger log = Logger.getLogger(MenuDelegate.class);

/**
* Called to let you update a menu item before it is displayed. If your
Expand All @@ -42,4 +44,32 @@ public boolean menu_updateItem_atIndex_shouldCancel(NSMenu menu, NSMenuItem item
}

public abstract boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel);

public boolean isValidationNeeded(NSMenu menu, int index) {
if(!open) {
if(log.isDebugEnabled()) {
log.debug("Interrupt menu item validation for:" + this);
}
return true;
}
return false;
}

private boolean open;

public void menuWillOpen(NSMenu menu) {
if(log.isDebugEnabled()) {
log.debug("menuWillOpen:" + menu);
}
open = true;
// Force validation
menu.update();
}

public void menuDidClose(NSMenu menu) {
if(log.isDebugEnabled()) {
log.debug("menuDidClose:" + menu);
}
open = true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,12 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
if(Rendezvous.instance().numberOfServices() == 0) {
item.setTitle(Locale.localizedString("No Bonjour services available"));
item.setEnabled(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
* dkocher@cyberduck.ch
*/

import ch.cyberduck.core.Path;
import ch.cyberduck.core.Local;
import ch.cyberduck.core.LocalFactory;
import ch.cyberduck.core.Path;
import ch.cyberduck.ui.cocoa.CDIconCache;
import ch.cyberduck.ui.cocoa.application.NSCell;
import ch.cyberduck.ui.cocoa.application.NSMenu;
Expand Down Expand Up @@ -54,6 +54,12 @@ public NSInteger numberOfItemsInMenu(NSMenu menu) {

@Override
public boolean menuUpdateItemAtIndex(NSMenu menu, NSMenuItem item, NSInteger index, boolean shouldCancel) {
if(shouldCancel) {
return false;
}
if(super.isValidationNeeded(menu, index.intValue())) {
return false;
}
final Path path = roots.get(index.intValue());
item.setTitle(path.getName());
if(path.getLocal().exists()) {
Expand Down

0 comments on commit ddfabef

Please sign in to comment.