diff --git a/CHANGES.md b/CHANGES.md index 0c461cf8..52d59ec0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,8 @@ # DurianSwt releases ## [Unreleased] + +## [4.3.0] - 2023-12-08 ### Added - `OS.detectPlatform` can now take a `Function, String>` which lets you control process execution when detecting the OS. ([#26](https://github.com/diffplug/durian-swt/pull/26)) diff --git a/README.md b/README.md index f643e858..7722d11c 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,8 @@ output = [ [![Maven central](https://img.shields.io/badge/mavencentral-com.diffplug.durian%3Adurian--swt-blue.svg)](https://search.maven.org/artifact/com.diffplug.durian/durian-swt) [![Apache 2.0](https://img.shields.io/badge/license-apache--2.0-blue.svg)](https://tldrlegal.com/license/apache-license-2.0-(apache-2.0)) -[![Changelog](https://img.shields.io/badge/changelog-4.2.2-brightgreen.svg)](CHANGES.md) -[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/overview-summary.html) +[![Changelog](https://img.shields.io/badge/changelog-4.3.0-brightgreen.svg)](CHANGES.md) +[![Javadoc](https://img.shields.io/badge/javadoc-yes-brightgreen.svg)](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/overview-summary.html) [![Live chat](https://img.shields.io/badge/gitter-chat-brightgreen.svg)](https://gitter.im/diffplug/durian) [![Travis CI](https://travis-ci.org/diffplug/durian-swt.svg?branch=master)](https://travis-ci.org/diffplug/durian-swt) @@ -25,11 +25,11 @@ output = prefixDelimiterReplace(input, 'https://javadoc.io/static/com.diffplug.d --> ### Infrastructure -* [`ControlWrapper`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/ControlWrapper.html) - create custom widgets which properly encapsulate their base control. -* [`Coat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/Coat.html) - a functional interface for populating an empty Composite. -* [`CoatMux`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/CoatMux.html) - a mechanism for layering and swapping Coats. -* [`SwtExec`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/SwtExec.html) - an `ExecutorService` which executes on the SWT thread. -* [`SwtExec.Guarded`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/SwtExec.Guarded.html) - an `ExecutorService` which is tied to the lifetime of an SWT widget. Say goodbye to `SWTException: Widget is disposed` forever! It can also subscribe to any kind of observable (Guava's ListenableFuture or RxJava's Observable), see [DurianRx](https://github.com/diffplug/durian-rx) for more info. +* [`ControlWrapper`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/ControlWrapper.html) - create custom widgets which properly encapsulate their base control. +* [`Coat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/Coat.html) - a functional interface for populating an empty Composite. +* [`CoatMux`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/CoatMux.html) - a mechanism for layering and swapping Coats. +* [`SwtExec`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/SwtExec.html) - an `ExecutorService` which executes on the SWT thread. +* [`SwtExec.Guarded`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/SwtExec.Guarded.html) - an `ExecutorService` which is tied to the lifetime of an SWT widget. Say goodbye to `SWTException: Widget is disposed` forever! It can also subscribe to any kind of observable (Guava's ListenableFuture or RxJava's Observable), see [DurianRx](https://github.com/diffplug/durian-rx) for more info. ```java SwtExec.async().guardOn(textBox).subscribe(serverResponse, txt -> { @@ -39,7 +39,7 @@ SwtExec.async().guardOn(textBox).subscribe(serverResponse, txt -> { ### Fluent builders -* [`Layouts`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/Layouts.html) - all the layouts you'll need in SWT +* [`Layouts`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/Layouts.html) - all the layouts you'll need in SWT ```java void textOkCanel(Composite cmp) { @@ -58,7 +58,7 @@ void textOkCanel(Composite cmp) { } ``` -* [`Shells`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/Shells.html) - dialogs without boilerplate +* [`Shells`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/Shells.html) - dialogs without boilerplate ```java Shells.builder(SWT.DIALOG_TRIM, this::textOkCanel) @@ -67,13 +67,13 @@ Shells.builder(SWT.DIALOG_TRIM, this::textOkCanel) .openOnDisplayBlocking(); ``` -* [`Actions`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/jface/Actions.html) - builder and one-liner: +* [`Actions`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/jface/Actions.html) - builder and one-liner: `Actions.create("Redo", this::redo);` -* [`LabelProviders`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/jface/LabelProviders.html) - builder and one-liner: +* [`LabelProviders`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/jface/LabelProviders.html) - builder and one-liner: `LabelProviders.createWithText(Person::getName)` -* [`ColumnFormat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/ColumnFormat.html) and [`ColumnViewerFormat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/jface/ColumnViewerFormat.html) - tables and trees without boilerplate +* [`ColumnFormat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/ColumnFormat.html) and [`ColumnViewerFormat`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/jface/ColumnViewerFormat.html) - tables and trees without boilerplate ```java ColumnViewerFormat format = ColumnViewerFormat.builder(); @@ -87,15 +87,15 @@ TreeViewer tree = format.buildTree(parent); ### Resource management -* [`OnePerWidget`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/OnePerWidget.html) - a cache tied to the lifetime of an SWT Widget. -* [`ColorPool`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/ColorPool.html) - a pool of colors tied to the lifetime of a widget. `ColorPool.forWidget(widget).getColor(rgbValue)` -* [`ImageDescriptors`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/jface/ImageDescriptors.html) - use ImageDescriptors with proper resource sharing. `ImageDescriptors.set(btn, imageDescriptor)` +* [`OnePerWidget`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/OnePerWidget.html) - a cache tied to the lifetime of an SWT Widget. +* [`ColorPool`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/ColorPool.html) - a pool of colors tied to the lifetime of a widget. `ColorPool.forWidget(widget).getColor(rgbValue)` +* [`ImageDescriptors`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/jface/ImageDescriptors.html) - use ImageDescriptors with proper resource sharing. `ImageDescriptors.set(btn, imageDescriptor)` ### Interactive testing Ideally, all UI code would have fully automated UI testing, but such tests are time-consuming to write, so they often just don't -get written at all. [`InteractiveTest`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/InteractiveTest.html) +get written at all. [`InteractiveTest`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/InteractiveTest.html) bridges the gap by making it easy to write user-in-the-loop guided tests. Furthermore, these tests can even be run in a [headless enviroment on a CI server](https://github.com/diffplug/durian-swt/blob/master/build.gradle#L66-L93), where the test UI will be opened, then automatically closed after a timeout. This ensures that the tests @@ -127,15 +127,15 @@ InteractiveTest.testCoat(message, cmp -> { ### Miscellaneous stuff -* [`SwtMisc`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/SwtMisc.html) - useful static methods. +* [`SwtMisc`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/SwtMisc.html) - useful static methods. + `blockForError`, `blockForSuccess`, `blockForQuestion`, etc. - opens a dialog and blocks for the user's response, can be called from any thread. + `loopUntil`, `loopUntilDisposed`, `loopUntilGet` - spins the SWT display loop until some condition is satisfied. + `systemFontHeight/Width`, `scaleByFont`, `scaleByFontHeight` - resolution-independent sizes. + `treeDefControl`, `treeDefComposite` - a [`TreeDef`](http://diffplug.github.io/durian/javadoc/snapshot/com/diffplug/common/base/TreeDef.html) for traversing UI elements. + `setEnabledDeep` - sets the enabled status of every child, grandchild, etc. of the given composite. -* [`SwtRx`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/SwtRx.html) - methods for converting SWT events and models to RxJava Observables. -* [`SwtDebug`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/SwtDebug.html) - utilities for debugging SWT events. -* [`OS`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/os/OS.html), [`Arch`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/os/Arch.html), and [`SwtPlatform`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/os/SwtPlatform.html) - detect things about the running system, and manipulate the SWT jars for build tools. +* [`SwtRx`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/SwtRx.html) - methods for converting SWT events and models to RxJava Observables. +* [`SwtDebug`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/SwtDebug.html) - utilities for debugging SWT events. +* [`OS`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/os/OS.html), [`Arch`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/os/Arch.html), and [`SwtPlatform`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/os/SwtPlatform.html) - detect things about the running system, and manipulate the SWT jars for build tools. + These do not require SWT or JFace, so you can add DurianSwt to your gradle or maven dependencies without needing to also figure out the SWT messiness. + You can also just copy-paste these straight into your own code - they have no external dependencies. ```java @@ -143,7 +143,7 @@ String installerExtension = OS.getNative().winMacLinux("exe","dmg","sh"); String helperBinary = "driver_" + Arch.getNative().x86x64("", "_64") + ".dll"; String swtJarName = "org.eclipse.swt." + SwtPlatform.getRunning(); ``` -* [`ViewerMisc`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.2.2/com/diffplug/common/swt/jface/ViewerMisc.html) - useful static methods for JFace viewers. +* [`ViewerMisc`](https://javadoc.io/static/com.diffplug.durian/durian-swt/4.3.0/com/diffplug/common/swt/jface/ViewerMisc.html) - useful static methods for JFace viewers. + `singleSelection`, `multiSelection` - returns an RxBox for listening to and setting the selection of a viewer. + `setTreeContentProvider`, `setLazyTreeContentProvider` - uses a TreeDef to provide the content of a TreeViewer.