Skip to content

Commit

Permalink
Issue #241
Browse files Browse the repository at this point in the history
javadoc refactoring
unit test refactoring
CHANGES.md update
  • Loading branch information
bsorrentino committed Jun 21, 2013
1 parent eca0444 commit 3183f00
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 137 deletions.
2 changes: 1 addition & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ NOTE: JNI native support is typically incompatible between minor versions, and a

Features
--------
* [##241](https://github.com/twall/jna/issues/241) - Add support function SHAppBarMessage from ShellApi
* [#241](https://github.com/twall/jna/issues/241) - Add support function SHAppBarMessage from ShellApi
* Added ASL licensing to facilitate distribution - [@twall](https://github.com/twall).
* [#109](https://github.com/twall/jna/issues/109): Set default Java compatibility level to 1.6 - [@twall](https://github.com/twall).
* [#209](https://github.com/twall/jna/issues/209): Improved default performance saving last error results - [@twall](https://github.com/twall).
Expand Down
89 changes: 34 additions & 55 deletions contrib/platform/src/com/sun/jna/platform/win32/Shell32.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.INT_PTR;
import com.sun.jna.platform.win32.WinDef.UINT_PTR;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinNT.HRESULT;
import com.sun.jna.ptr.PointerByReference;
Expand Down Expand Up @@ -172,61 +173,39 @@ INT_PTR ShellExecute(HWND hwnd, String lpOperation, String lpFile, String lpPara

/**
* SHAppBarMessage function
4 out of 8 rated this helpful - Rate this topic
Sends an appbar message to the system.
Syntax
C++
UINT_PTR SHAppBarMessage(
_In_ DWORD dwMessage,
_Inout_ PAPPBARDATA pData
);
Parameters
dwMessage [in]
Type: DWORD
Appbar message value to send. This parameter can be one of the following values.
ABM_NEW (0x00000000)
Registers a new appbar and specifies the message identifier that the system should use to send notification messages to the appbar.
ABM_REMOVE (0x00000001)
Unregisters an appbar, removing the bar from the system's internal list.
ABM_QUERYPOS (0x00000002)
Requests a size and screen position for an appbar.
ABM_SETPOS (0x00000003)
Sets the size and screen position of an appbar.
ABM_GETSTATE (0x00000004)
Retrieves the autohide and always-on-top states of the Windows taskbar.
ABM_GETTASKBARPOS (0x00000005)
Retrieves the bounding rectangle of the Windows taskbar. Note that this applies only to the system taskbar. Other objects, particularly toolbars supplied with third-party software, also can be present. As a result, some of the screen area not covered by the Windows taskbar might not be visible to the user. To retrieve the area of the screen not covered by both the taskbar and other app barsÑthe working area available to your applicationÑ, use the GetMonitorInfo function.
ABM_ACTIVATE (0x00000006)
Notifies the system to activate or deactivate an appbar. The lParam member of the APPBARDATA pointed to by pData is set to TRUE to activate or FALSE to deactivate.
ABM_GETAUTOHIDEBAR (0x00000007)
Retrieves the handle to the autohide appbar associated with a particular edge of the screen.
ABM_SETAUTOHIDEBAR (0x00000008)
Registers or unregisters an autohide appbar for an edge of the screen.
ABM_WINDOWPOSCHANGED (0x00000009)
Notifies the system when an appbar's position has changed.
ABM_SETSTATE (0x0000000A)
Windows XP and later: Sets the state of the appbar's autohide and always-on-top attributes.
pData [in, out]
Type: PAPPBARDATA
A pointer to an APPBARDATA structure. The content of the structure on entry and on exit depends on the value set in the dwMessage parameter. See the individual message pages for specifics.
Return value
Type: UINT_PTR
This function returns a message-dependent value. For more information, see the Windows SDK documentation for the specific appbar message sent. Links to those documents are given in the See Also section.
Requirements
Minimum supported client
Windows XP [desktop apps only]
Minimum supported server
Windows 2000 Server [desktop apps only]
Header
Shellapi.h
Library
Shell32.lib
DLL
Shell32.dll (version 4.0 or later)
*
* @param dwMessage
* Appbar message value to send. This parameter can be one of the following values.
* {@link ShellAPI#ABM_NEW} Registers a new appbar and specifies the message identifier that the system should use to send notification messages to the appbar.
* {@link ShellAPI#ABM_REMOVE} Unregisters an appbar, removing the bar from the system's internal list.
* {@link ShellAPI#ABM_QUERYPOS} Requests a size and screen position for an appbar.
* {@link ShellAPI#ABM_SETPOS} Sets the size and screen position of an appbar.
* {@link ShellAPI#ABM_GETSTATE} Retrieves the autohide and always-on-top states of the Windows taskbar.
* {@link ShellAPI#ABM_GETTASKBARPOS} Retrieves the bounding rectangle of the Windows taskbar. Note that this applies only to the system taskbar. Other objects, particularly toolbars supplied with third-party software, also can be present. As a result, some of the screen area not covered by the Windows taskbar might not be visible to the user. To retrieve the area of the screen not covered by both the taskbar and other app barsÑthe working area available to your applicationÑ, use the GetMonitorInfo function.
* {@link ShellAPI#ABM_ACTIVATE} Notifies the system to activate or deactivate an appbar. The lParam member of the APPBARDATA pointed to by pData is set to TRUE to activate or FALSE to deactivate.
* {@link ShellAPI#ABM_GETAUTOHIDEBAR} Retrieves the handle to the autohide appbar associated with a particular edge of the screen.
* {@link ShellAPI#ABM_SETAUTOHIDEBAR} Registers or unregisters an autohide appbar for an edge of the screen.
* {@link ShellAPI#ABM_WINDOWPOSCHANGED} Notifies the system when an appbar's position has changed.
* {@link ShellAPI#ABM_SETSTATE} Windows XP and later: Sets the state of the appbar's autohide and always-on-top attributes.
*
* @param pData
* A pointer to an APPBARDATA structure. The content of the structure on entry and on exit depends on the value set in the dwMessage parameter. See the individual message pages for specifics.
*
* @return This function returns a message-dependent value. For more information, see the Windows SDK documentation for the specific appbar message sent.
*
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787951(v=vs.85).aspx">ABM_NEW</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787955(v=vs.85).aspx">ABM_REMOVE</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787953(v=vs.85).aspx">ABM_QUERYPOS</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787959(v=vs.85).aspx">ABM_SETPOS</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787947(v=vs.85).aspx">ABM_GETSTATE</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787949(v=vs.85).aspx">ABM_GETTASKBARPOS</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787943(v=vs.85).aspx">ABM_ACTIVATE</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787945(v=vs.85).aspx">ABM_GETAUTOHIDEBAR</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787957(v=vs.85).aspx">ABM_SETAUTOHIDEBAR</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787963(v=vs.85).aspx">ABM_WINDOWPOSCHANGED</a>
* @see <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/bb787961(v=vs.85).aspx">ABM_SETSTATE</a>
*
*/

HANDLE SHAppBarMessage( DWORD dwMessage, APPBARDATA pData );
UINT_PTR SHAppBarMessage( DWORD dwMessage, APPBARDATA pData );
}
92 changes: 58 additions & 34 deletions contrib/platform/src/com/sun/jna/platform/win32/ShellAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -125,61 +125,85 @@ public String encodePaths(String[] paths) {

}

// Appbar message value to send. This parameter can be one of the following values.
/**
* Appbar message value to send. This parameter can be one of the following
* values.
*/
int ABM_NEW = 0x00000000;
//Registers a new appbar and specifies the message identifier that the system should use to send notification messages to the appbar.
/**
* Registers a new appbar and specifies the message identifier that the
* system should use to send notification messages to the appbar.
*/
int ABM_REMOVE = 0x00000001;
//Unregisters an appbar, removing the bar from the system's internal list.
/** Unregisters an appbar, removing the bar from the system's internal list.*/
int ABM_QUERYPOS = 0x00000002;
//Requests a size and screen position for an appbar.
/** Requests a size and screen position for an appbar. */
int ABM_SETPOS = 0x00000003;
//Sets the size and screen position of an appbar.
/** Sets the size and screen position of an appbar. */
int ABM_GETSTATE = 0x00000004;
//Retrieves the autohide and always-on-top states of the Windows taskbar.
/** Retrieves the autohide and always-on-top states of the Windows taskbar. */
int ABM_GETTASKBARPOS = 0x00000005;
//Retrieves the bounding rectangle of the Windows taskbar. Note that this applies only to the system taskbar. Other objects, particularly toolbars supplied with third-party software, also can be present. As a result, some of the screen area not covered by the Windows taskbar might not be visible to the user. To retrieve the area of the screen not covered by both the taskbar and other app barsÑthe working area available to your applicationÑ, use the GetMonitorInfo function.
/**
* Retrieves the bounding rectangle of the Windows taskbar. Note that this
* applies only to the system taskbar. Other objects, particularly toolbars
* supplied with third-party software, also can be present. As a result,
* some of the screen area not covered by the Windows taskbar might not be
* visible to the user. To retrieve the area of the screen not covered by
* both the taskbar and other app barsÑthe working area available to your
* applicationÑ, use the GetMonitorInfo function.
*/
int ABM_ACTIVATE = 0x00000006;
//Notifies the system to activate or deactivate an appbar. The lParam member of the APPBARDATA pointed to by pData is set to TRUE to activate or FALSE to deactivate.
/**
* Notifies the system to activate or deactivate an appbar. The lParam
* member of the APPBARDATA pointed to by pData is set to TRUE to activate
* or FALSE to deactivate.
*/
int ABM_GETAUTOHIDEBAR = 0x00000007;
//Retrieves the handle to the autohide appbar associated with a particular edge of the screen.
/**
* Retrieves the handle to the autohide appbar associated with a particular
* edge of the screen.
*/
int ABM_SETAUTOHIDEBAR = 0x00000008;
//Registers or unregisters an autohide appbar for an edge of the screen.
/** Registers or unregisters an autohide appbar for an edge of the screen. */
int ABM_WINDOWPOSCHANGED = 0x00000009;
//Notifies the system when an appbar's position has changed.
/** Notifies the system when an appbar's position has changed. */
int ABM_SETSTATE = 0x0000000A;

int ABE_LEFT = 0; // Left edge.
int ABE_TOP = 1; // Top edge.
int ABE_RIGHT = 2; // Right edge.
int ABE_BOTTOM = 3; // Bottom edge.

/** Left edge. */
int ABE_LEFT = 0;
/** Top edge. */
int ABE_TOP = 1;
/** Right edge. */
int ABE_RIGHT = 2;
/** Bottom edge. */
int ABE_BOTTOM = 3;

/**
* Contains information about a system appbar message.
*/
public static class APPBARDATA extends Structure {
public static class ByReference extends APPBARDATA implements Structure.ByReference {}
public static class ByReference extends APPBARDATA implements Structure.ByReference {
}

public DWORD cbSize;
public HWND hWnd;
public UINT uCallbackMessage;
public UINT uEdge;
public RECT rc;
public LPARAM lParam;
public DWORD cbSize;
public HWND hWnd;
public UINT uCallbackMessage;
public UINT uEdge;
public RECT rc;
public LPARAM lParam;

public APPBARDATA() {
super();
public APPBARDATA() {
super();
}

public APPBARDATA(Pointer p) {
super(p);
}
public APPBARDATA(Pointer p) {
super(p);
}

@Override
protected List getFieldOrder() {
return Arrays.asList("cbSize", "hWnd", "uCallbackMessage", "uEdge",
"rc", "lParam");
}

@Override
protected List getFieldOrder() {
return Arrays.asList("cbSize", "hWnd", "uCallbackMessage", "uEdge", "rc", "lParam");
}
}

}
85 changes: 38 additions & 47 deletions contrib/platform/test/com/sun/jna/platform/win32/Shell32Test.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import com.sun.jna.platform.win32.ShellAPI.APPBARDATA;
import com.sun.jna.platform.win32.WinDef.DWORD;
import com.sun.jna.platform.win32.WinDef.RECT;
import com.sun.jna.platform.win32.WinNT.HANDLE;
import com.sun.jna.platform.win32.WinDef.UINT_PTR;
import com.sun.jna.ptr.PointerByReference;


Expand All @@ -35,12 +35,6 @@ public static void main(String[] args) {
junit.textui.TestRunner.run(Shell32Test.class);
}

public void setup() {

APPBARDATA ABData = new APPBARDATA();


}
public void testSHGetFolderPath() {
char[] pszPath = new char[WinDef.MAX_PATH];
assertEquals(W32Errors.S_OK, Shell32.INSTANCE.SHGetFolderPath(null,
Expand All @@ -62,92 +56,89 @@ public final void testSHGetSpecialFolderPath() {
assertTrue(Shell32.INSTANCE.SHGetSpecialFolderPath(null, pszPath, ShlObj.CSIDL_APPDATA, false));
assertFalse(Native.toString(pszPath).isEmpty());
}


private boolean AppBar_Register() {
private void newAppBar() {
DWORD dwABM = new DWORD();

APPBARDATA ABData = new APPBARDATA.ByReference();
ABData.uCallbackMessage.setValue( WM_USER + 1);
ABData.cbSize.setValue( ABData.size() );
dwABM.setValue(ShellAPI.ABM_NEW);

return (null!=Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData));
UINT_PTR result = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData);
assertNotNull(result );
}

private boolean AppBar_Unregister() {
private void removeAppBar() {

DWORD dwABM = new DWORD();
APPBARDATA ABData = new APPBARDATA.ByReference();
ABData.cbSize.setValue( ABData.size() );
dwABM.setValue(ShellAPI.ABM_REMOVE);
return (null!=Shell32.INSTANCE.SHAppBarMessage(dwABM, ABData));
UINT_PTR result = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData);
assertNotNull(result );

}

public void queryPos( APPBARDATA ABData ) {
private void queryPos( APPBARDATA ABData ) {
DWORD dwABM = new DWORD();

dwABM.setValue(ShellAPI.ABM_QUERYPOS);
HANDLE h = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData );
UINT_PTR h = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData );

assertNotNull(h);
assertTrue(h.intValue()>0);

System.out.printf( "ABData.rc[%d,%d,%d,%d]\n",
ABData.rc.top,
ABData.rc.left,
ABData.rc.bottom,
ABData.rc.right);

}

public void testResizeDesktopFromBottom() throws InterruptedException {

newAppBar();

DWORD dwABM = new DWORD();

assertTrue( AppBar_Register() );

APPBARDATA ABData = new APPBARDATA.ByReference();
System.out.printf( "APPBARDATA sizeof [%d]\n", ABData.size());
APPBARDATA data = new APPBARDATA.ByReference();

ABData.uEdge.setValue(ShellAPI.ABE_BOTTOM);
ABData.rc.top = User32.INSTANCE.GetSystemMetrics(User32.SM_CYFULLSCREEN) - RESIZE_HEIGHT;
ABData.rc.left = 0;
ABData.rc.bottom = User32.INSTANCE.GetSystemMetrics(User32.SM_CYFULLSCREEN);
ABData.rc.right = User32.INSTANCE.GetSystemMetrics(User32.SM_CXFULLSCREEN);
data.uEdge.setValue(ShellAPI.ABE_BOTTOM);
data.rc.top = User32.INSTANCE.GetSystemMetrics(User32.SM_CYFULLSCREEN) - RESIZE_HEIGHT;
data.rc.left = 0;
data.rc.bottom = User32.INSTANCE.GetSystemMetrics(User32.SM_CYFULLSCREEN);
data.rc.right = User32.INSTANCE.GetSystemMetrics(User32.SM_CXFULLSCREEN);

queryPos(ABData);
queryPos(data);

dwABM.setValue(ShellAPI.ABM_SETPOS);
HANDLE h = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData );
UINT_PTR h = Shell32.INSTANCE.SHAppBarMessage( dwABM, data );

assertNotNull(h);


Thread.sleep( 5 * 1000 );
assertTrue( AppBar_Unregister() );

assertTrue(h.intValue()>=0);

removeAppBar();
}

public void testResizeDesktopFromTop() throws InterruptedException {
newAppBar();

DWORD dwABM = new DWORD();

assertTrue( AppBar_Register() );

APPBARDATA ABData = new APPBARDATA.ByReference();
ABData.uEdge.setValue(ShellAPI.ABE_TOP);
ABData.rc.top = 0;
ABData.rc.left = 0;
ABData.rc.bottom = RESIZE_HEIGHT;
ABData.rc.right = User32.INSTANCE.GetSystemMetrics(User32.SM_CXFULLSCREEN);

queryPos(ABData);
APPBARDATA data = new APPBARDATA.ByReference();
data.uEdge.setValue(ShellAPI.ABE_TOP);
data.rc.top = 0;
data.rc.left = 0;
data.rc.bottom = RESIZE_HEIGHT;
data.rc.right = User32.INSTANCE.GetSystemMetrics(User32.SM_CXFULLSCREEN);

queryPos(data);

dwABM.setValue(ShellAPI.ABM_SETPOS);
HANDLE h = Shell32.INSTANCE.SHAppBarMessage( dwABM, ABData );
UINT_PTR h = Shell32.INSTANCE.SHAppBarMessage( dwABM, data );

assertNotNull(h);
assertTrue(h.intValue()>=0);

Thread.sleep( 5 * 1000 );
assertTrue( AppBar_Unregister() );
removeAppBar();

}

Expand Down

0 comments on commit 3183f00

Please sign in to comment.