Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
b38bb96
Auto size popup button.
dkocher Sep 15, 2025
3b7c2c2
Add annotation.
dkocher Sep 15, 2025
50bbf53
Increase padding.
dkocher Sep 15, 2025
cac0606
Increase height and add padding in bottom bar.
dkocher Sep 15, 2025
e47ec06
Review view layout.
dkocher Sep 15, 2025
49227b3
Use system symbols.
dkocher Sep 15, 2025
71a2fe9
Remove fill in symbols.
dkocher Sep 15, 2025
bd7674c
Changes.
dkocher Sep 16, 2025
0d89e8f
Switch to constraint layout.
dkocher Sep 23, 2025
a71bd40
Use system icons.
dkocher Sep 30, 2025
fd21f97
Add system icons for menu items.
dkocher Sep 30, 2025
ecdf7eb
Add implementation to run alerts as popover.
dkocher Oct 5, 2025
868ef29
Remove URL field.
dkocher Oct 5, 2025
4d6e0c5
Use system images.
dkocher Oct 23, 2025
f673c3f
Fix location.
dkocher Oct 24, 2025
cd4a666
Remove custom disclosable view implementation.
dkocher Oct 24, 2025
533c689
Switch to constraint layout. Use popover for file details.
dkocher Oct 25, 2025
a409e7f
Use system image.
dkocher Oct 26, 2025
9a23b74
Allow custom positioning rect.
dkocher Oct 26, 2025
567a283
Auto resize window from constraints.
dkocher Oct 26, 2025
1d2edc0
Rename field.
dkocher Oct 26, 2025
4fe8297
Remove toggle.
dkocher Oct 26, 2025
a532730
Remove comment field.
dkocher Oct 26, 2025
ddc7175
Add keyword.
dkocher Oct 26, 2025
1e58c45
Display bookmark window as popover.
dkocher Oct 26, 2025
6e6d61f
Replace with lambda.
dkocher Oct 27, 2025
d03c8ed
Add flag for popover or floating window display.
dkocher Oct 27, 2025
fb03555
Switch to constraint layout.
dkocher Oct 27, 2025
b42f0d5
Hide controls when configuration option not available.
dkocher Oct 27, 2025
d7f42ab
Move field up.
dkocher Oct 27, 2025
2fe7912
Change to local scope.
dkocher Oct 27, 2025
599fefc
Move field up.
dkocher Oct 27, 2025
310d65e
Use regular bookmark panel.
dkocher Oct 27, 2025
30c8085
Localize.
dkocher Oct 27, 2025
ade1706
Add images for local and server URL.
dkocher Oct 27, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* [Feature] Connect with Multi-Bucket Application Keys that grant access to a specific group of buckets within an
account, including the option to limit access based on a single file prefix (
B2) ([#17139](https://trac.cyberduck.io/ticket/17139))
* [Feature] Support for Liquid Glass (macOS) ([#17459](https://trac.cyberduck.io/ticket/17459))
* [Feature] Connect with connection profile obtaining temporary credentials from AWS Security Token Service (STS) by
assuming role with optional Multi-Factor Authentication (MFA) input (
S3) ([#17437](https://trac.cyberduck.io/ticket/17437))
Expand Down
2 changes: 0 additions & 2 deletions Credits.rtf
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,6 @@
\cf3 Synapticloop\
\cf0 {\field{\*\fldinst{HYPERLINK "http://zathras.de/"}}{\fldrslt UKCrashReporter}}\
\cf3 M. Uli Kusterer\
\cf0 {\field{\*\fldinst{HYPERLINK "http://www.snoize.com/"}}{\fldrslt SNDisclosableView}}\
\cf3 Kurt Revis\
\cf0 {\field{\*\fldinst{HYPERLINK "https://opensource.apple.com/tarballs/mDNSResponder/"}}{\fldrslt mDNSResponder}}\
\cf3 Apple Inc.\
\cf0 {\field{\*\fldinst{HYPERLINK "https://sparkle-project.org/"}}{\fldrslt Sparkle}}\
Expand Down
9 changes: 0 additions & 9 deletions Cyberduck.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,6 @@
47F85C361C0F103E00FDA856 /* CDOutlineView.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F85C241C0F103E00FDA856 /* CDOutlineView.h */; };
47F85C371C0F103E00FDA856 /* CDOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F85C251C0F103E00FDA856 /* CDOutlineView.m */; };
47F85C3C1C0F103E00FDA856 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F85C2A1C0F103E00FDA856 /* main.m */; };
47F85C401C0F103E00FDA856 /* SNDisclosableView.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F85C2E1C0F103E00FDA856 /* SNDisclosableView.h */; };
47F85C411C0F103E00FDA856 /* SNDisclosableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F85C2F1C0F103E00FDA856 /* SNDisclosableView.m */; };
47F9380F1D7F63CE00108AB5 /* dropbox.tiff in Resources */ = {isa = PBXBuildFile; fileRef = 47F9380E1D7F63CE00108AB5 /* dropbox.tiff */; };
47FB0FD724B3C7FB00C6764E /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47FB0FD624B3C7FA00C6764E /* Security.framework */; };
47FB0FDE24B3C88A00C6764E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47FB0FDD24B3C88A00C6764E /* Foundation.framework */; };
Expand Down Expand Up @@ -1746,8 +1744,6 @@
47F85C241C0F103E00FDA856 /* CDOutlineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CDOutlineView.h; path = osx/src/main/objc/CDOutlineView.h; sourceTree = "<group>"; };
47F85C251C0F103E00FDA856 /* CDOutlineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CDOutlineView.m; path = osx/src/main/objc/CDOutlineView.m; sourceTree = "<group>"; };
47F85C2A1C0F103E00FDA856 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = osx/src/main/objc/main.m; sourceTree = "<group>"; };
47F85C2E1C0F103E00FDA856 /* SNDisclosableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SNDisclosableView.h; path = osx/src/main/objc/SNDisclosableView.h; sourceTree = "<group>"; };
47F85C2F1C0F103E00FDA856 /* SNDisclosableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SNDisclosableView.m; path = osx/src/main/objc/SNDisclosableView.m; sourceTree = "<group>"; };
47F9380E1D7F63CE00108AB5 /* dropbox.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = dropbox.tiff; sourceTree = "<group>"; };
47FB0FD624B3C7FA00C6764E /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = ../MacOSX.sdk/System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; };
47FB0FDA24B3C84A00C6764E /* QuickLookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLookUI.framework; path = ../MacOSX.sdk/System/Library/Frameworks/Quartz.framework/Versions/A/Frameworks/QuickLookUI.framework; sourceTree = SDKROOT; };
Expand Down Expand Up @@ -1919,7 +1915,6 @@
473A8DD5287424CA00CD2E12 /* WorkspaceSchemeHandlerProxy.m */,
);
name = Core;
path = source;
sourceTree = "<group>";
};
4741639206C4F58D00AC0BD2 /* Resources */ = {
Expand Down Expand Up @@ -2144,8 +2139,6 @@
47F85C241C0F103E00FDA856 /* CDOutlineView.h */,
47F85C251C0F103E00FDA856 /* CDOutlineView.m */,
47F85C2A1C0F103E00FDA856 /* main.m */,
47F85C2E1C0F103E00FDA856 /* SNDisclosableView.h */,
47F85C2F1C0F103E00FDA856 /* SNDisclosableView.m */,
47D6FFE61CCFA54A005B01C5 /* CDToolbarItem.m */,
47D6FFE71CCFA54A005B01C5 /* CDToolbarItem.h */,
);
Expand Down Expand Up @@ -2185,7 +2178,6 @@
47FB79D81C2E9E67008D3B9C /* launcher.h in Headers */,
47F85C361C0F103E00FDA856 /* CDOutlineView.h in Headers */,
47D6FFE91CCFA54A005B01C5 /* CDToolbarItem.h in Headers */,
47F85C401C0F103E00FDA856 /* SNDisclosableView.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -2655,7 +2647,6 @@
47F85C371C0F103E00FDA856 /* CDOutlineView.m in Sources */,
47F85C311C0F103E00FDA856 /* CDBookmarkCell.m in Sources */,
47F85C351C0F103E00FDA856 /* CDOutlineCell.m in Sources */,
47F85C411C0F103E00FDA856 /* SNDisclosableView.m in Sources */,
47F85C331C0F103E00FDA856 /* CDListView.m in Sources */,
47D6FFE81CCFA54A005B01C5 /* CDToolbarItem.m in Sources */,
47F85C3C1C0F103E00FDA856 /* main.m in Sources */,
Expand Down
100 changes: 100 additions & 0 deletions binding/src/main/java/ch/cyberduck/binding/ProxyController.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,15 @@

import ch.cyberduck.binding.application.NSAlert;
import ch.cyberduck.binding.application.NSApplication;
import ch.cyberduck.binding.application.NSPopover;
import ch.cyberduck.binding.application.NSView;
import ch.cyberduck.binding.application.NSViewController;
import ch.cyberduck.binding.application.NSWindow;
import ch.cyberduck.binding.application.SheetCallback;
import ch.cyberduck.binding.application.WindowListener;
import ch.cyberduck.binding.foundation.FoundationKitFunctions;
import ch.cyberduck.binding.foundation.NSNotification;
import ch.cyberduck.binding.foundation.NSObject;
import ch.cyberduck.binding.foundation.NSThread;
import ch.cyberduck.core.AbstractController;
import ch.cyberduck.core.threading.DefaultMainAction;
Expand All @@ -28,11 +34,14 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.rococoa.ID;
import org.rococoa.cocoa.foundation.NSRect;
import org.rococoa.cocoa.foundation.NSSize;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;

import com.google.common.util.concurrent.Uninterruptibles;

Expand Down Expand Up @@ -153,6 +162,16 @@ public int alert(final SheetController sheet, final AlertRunner runner, final Co
protected static final Set<AlertRunner> alerts
= new HashSet<>();

/**
* @param sheet Controller for alert window
* @param callback Handler invoked after sheet is dismissed with selected option
* @param runner Implementation to display alert window
* @return Selected alert option by user
*/
public int alert(final SheetController sheet, final SheetCallback callback, final AlertRunner runner) {
return this.alert(sheet, callback, runner, new CountDownLatch(1));
}

/**
* Display as sheet attached to window of parent controller
*
Expand Down Expand Up @@ -309,4 +328,85 @@ public void callback(final int returncode) {
signal.countDown();
}
}

public static final class PopoverAlertRunner extends Proxy implements AlertRunner, AlertRunner.CloseHandler, WindowListener {
private final NSPopover popover = NSPopover.create();
private final NSView positioningView;
private final NSRect positioningRect;
private final SheetController controller;
private final AtomicReference<Proxy> reference = new AtomicReference<>();
private final AtomicInteger option = new AtomicInteger(SheetCallback.CANCEL_OPTION);

public PopoverAlertRunner(final NSView positioningView, final SheetController controller) {
this(positioningView, positioningView.frame(), controller);
}

public PopoverAlertRunner(final NSView positioningView, final NSRect positioningRect, final SheetController controller) {
this.positioningView = positioningView;
this.positioningRect = positioningRect;
this.controller = controller;
this.controller.addHandler(this);
}

@Override
public void alert(final NSWindow sheet, final SheetCallback callback) {
NSApplication.sharedApplication().activateIgnoringOtherApps(true);
final Proxy proxy = new PopoverDelegate(controller, option, callback);
reference.set(proxy);
popover.setDelegate(proxy.id());
popover.setAnimates(true);
popover.setBehavior(NSPopover.NSPopoverBehaviorSemitransient);
final NSViewController viewController = NSViewController.create();
viewController.setView(sheet.contentView());
popover.setContentViewController(viewController);
popover.showRelativeToRect_ofView_preferredEdge(positioningRect, positioningView,
FoundationKitFunctions.NSRectEdge.NSMinYEdge);
controller.addListener(this);
}

@Override
public void windowDidResize(final NSSize windowFrame) {
log.debug("Resize popover to {}", windowFrame);
popover.setContentSize(controller.view().fittingSize());
}

@Override
public void closed(final NSWindow sheet, final int returncode) {
option.set(returncode);
popover.performClose(null);
}
}

public static final class PopoverDelegate extends Proxy {
private final SheetController controller;
private final AtomicInteger returncode;
private final SheetCallback callback;

public PopoverDelegate(final SheetController controller, final AtomicInteger returncode, final SheetCallback callback) {
this.controller = controller;
this.returncode = returncode;
this.callback = callback;
}

@Delegate
public void popoverWillClose(final NSNotification notification) {
final NSObject popoverCloseReasonValue = notification.userInfo().objectForKey(NSPopover.NSPopoverCloseReasonKey);
if(popoverCloseReasonValue != null) {
if(NSPopover.NSPopoverCloseReasonValue.NSPopoverCloseReasonStandard.equals(popoverCloseReasonValue.toString())) {
log.debug("Notify {} of return code {}", callback, returncode.get());
// No window close notification for popover
controller.invalidate();
callback.callback(returncode.get());
}
else {
log.debug("Ignore notification {}", notification);
}
}
}

@Delegate
public boolean popoverShouldDetach(final NSPopover popover) {
return true;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.rococoa.cocoa.CGFloat;
import org.rococoa.cocoa.foundation.NSInteger;
import org.rococoa.cocoa.foundation.NSPoint;
import org.rococoa.cocoa.foundation.NSRect;
import org.rococoa.cocoa.foundation.NSUInteger;

/// <i>native declaration : :69</i>
Expand Down Expand Up @@ -841,4 +842,13 @@ public void editRow(NSInteger column, NSInteger row, boolean select) {
* <i>from NSDeprecated native declaration : :528</i><br>
* Conversion Error : NSRect
*/

/**
* Returns the rectangle containing the row at the specified index.
*
* @param row Table row
* @return The rectangle containing the row at rowIndex. Returns NSZeroRect if rowIndex lies outside the range of valid row indexes for the table view.
*/
public abstract NSRect rectOfRow(NSInteger row);

}
6 changes: 6 additions & 0 deletions defaults/src/main/resources/default.properties
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,12 @@ browser.delete.trash=true
browser.filesize.decimal=false
browser.date.natural=true

bookmark.window.popover=true
bookmark.protocol.configurable=true
bookmark.name.configurable=true
bookmark.labels.configurable=true
bookmark.username.configurable=true
bookmark.password.configurable=true
bookmark.toggle.options=false
transfer.toggle.details=true

Expand Down
Binary file modified i18n/src/main/resources/ar.lproj/Bookmark.strings
Binary file not shown.
Loading