
org.eclipse.swt.widgets.TaskBar Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of org.eclipse.swt.win32.win32.x86 Show documentation
Show all versions of org.eclipse.swt.win32.win32.x86 Show documentation
SWT is an open source widget toolkit for Java designed to provide efficient, portable access to the user-interface facilities of the operating systems on which it is implemented.
The newest version!
/*******************************************************************************
* Copyright (c) 2010, 2012 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.swt.widgets;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.internal.win32.*;
import org.eclipse.swt.*;
/**
* Instances of this class represent the system task bar.
*
*
* - Styles:
* - (none)
* - Events:
* - (none)
*
*
* @see Display#getSystemTaskBar
* @see Sample code and further information
*
* @since 3.6
*
* @noextend This class is not intended to be subclassed by clients.
*/
public class TaskBar extends Widget {
int itemCount;
TaskItem [] items = new TaskItem [4];
int /*long*/ mTaskbarList3;
static final char [] EXE_PATH;
static final char [] ICO_DIR = {'i','c','o','_','d','i','r','\0'};
static final PROPERTYKEY PKEY_Title = new PROPERTYKEY ();
static final PROPERTYKEY PKEY_AppUserModel_IsDestListSeparator = new PROPERTYKEY ();
static final String EXE_PATH_KEY = "org.eclipse.swt.win32.taskbar.executable"; //$NON-NLS-1$
static final String EXE_ARGS_KEY = "org.eclipse.swt.win32.taskbar.arguments"; //$NON-NLS-1$
static final String ICON_KEY = "org.eclipse.swt.win32.taskbar.icon"; //$NON-NLS-1$
static final String ICON_INDEX_KEY = "org.eclipse.swt.win32.taskbar.icon.index"; //$NON-NLS-1$
static final byte [] CLSID_TaskbarList = new byte [16];
static final byte [] CLSID_DestinationList = new byte[16];
static final byte [] CLSID_EnumerableObjectCollection = new byte[16];
static final byte [] CLSID_ShellLink = new byte[16];
static final byte [] CLSID_FileOperation = new byte [16];
static final byte [] IID_ITaskbarList3 = new byte [16];
static final byte [] IID_ICustomDestinationList = new byte[16];
static final byte [] IID_IObjectArray = new byte[16];
static final byte [] IID_IObjectCollection = new byte[16];
static final byte [] IID_IShellLinkW = new byte[16];
static final byte [] IID_IPropertyStore = new byte[16];
static final byte [] IID_IShellItem = new byte [16];
static final byte [] IID_IFileOperation = new byte [16];
static final byte [] FOLDERID_LocalAppData = new byte [16];
static {
OS.IIDFromString ("{56FDF344-FD6D-11d0-958A-006097C9A090}\0".toCharArray (), CLSID_TaskbarList); //$NON-NLS-1$
OS.IIDFromString ("{77f10cf0-3db5-4966-b520-b7c54fd35ed6}\0".toCharArray (), CLSID_DestinationList); //$NON-NLS-1$
OS.IIDFromString ("{2d3468c1-36a7-43b6-ac24-d3f02fd9607a}\0".toCharArray (), CLSID_EnumerableObjectCollection); //$NON-NLS-1$
OS.IIDFromString ("{00021401-0000-0000-C000-000000000046}\0".toCharArray (), CLSID_ShellLink); //$NON-NLS-1$
OS.IIDFromString ("{3ad05575-8857-4850-9277-11b85bdb8e09}\0".toCharArray (), CLSID_FileOperation);
OS.IIDFromString ("{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}\0".toCharArray (), IID_ITaskbarList3); //$NON-NLS-1$
OS.IIDFromString ("{6332debf-87b5-4670-90c0-5e57b408a49e}\0".toCharArray (), IID_ICustomDestinationList); //$NON-NLS-1$
OS.IIDFromString ("{92CA9DCD-5622-4bba-A805-5E9F541BD8C9}\0".toCharArray (), IID_IObjectArray); //$NON-NLS-1$
OS.IIDFromString ("{5632b1a4-e38a-400a-928a-d4cd63230295}\0".toCharArray (), IID_IObjectCollection); //$NON-NLS-1$
OS.IIDFromString ("{000214F9-0000-0000-C000-000000000046}\0".toCharArray (), IID_IShellLinkW); //$NON-NLS-1$
OS.IIDFromString ("{886d8eeb-8cf2-4446-8d02-cdba1dbdcf99}\0".toCharArray (), IID_IPropertyStore); //$NON-NLS-1$
OS.IIDFromString ("{43826d1e-e718-42ee-bc55-a1e261c37bfe}\0".toCharArray (), IID_IShellItem); //$NON-NLS-1$
OS.IIDFromString ("{947aab5f-0a5c-4c13-b4d6-4bf7836fc9f8}\0".toCharArray (), IID_IFileOperation); //$NON-NLS-1$
OS.IIDFromString ("{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}\0".toCharArray (), FOLDERID_LocalAppData); //$NON-NLS-1$
OS.PSPropertyKeyFromString ("{F29F85E0-4FF9-1068-AB91-08002B27B3D9} 2\0".toCharArray (), PKEY_Title); //$NON-NLS-1$
OS.PSPropertyKeyFromString ("{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}, 6\0".toCharArray (), PKEY_AppUserModel_IsDestListSeparator); //$NON-NLS-1$
TCHAR buffer = new TCHAR (0, OS.MAX_PATH);
while (OS.GetModuleFileName (0, buffer, buffer.length ()) == buffer.length ()) {
buffer = new TCHAR (0, buffer.length () + OS.MAX_PATH);
}
int length = buffer.strlen ();
EXE_PATH = new char [length + 1];
System.arraycopy (buffer.chars, 0, EXE_PATH, 0, length);
}
TaskBar (Display display, int style) {
if (display == null) display = Display.getCurrent ();
if (display == null) display = Display.getDefault ();
if (!display.isValidThread ()) {
error (SWT.ERROR_THREAD_INVALID_ACCESS);
}
this.display = display;
createHandle ();
reskinWidget ();
}
void createHandle () {
int /*long*/[] ppv = new int /*long*/ [1];
int hr = OS.CoCreateInstance (CLSID_TaskbarList, 0, OS.CLSCTX_INPROC_SERVER, IID_ITaskbarList3, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_NO_HANDLES);
mTaskbarList3 = ppv [0];
}
void createItem (TaskItem item, int index) {
if (index == -1) index = itemCount;
if (!(0 <= index && index <= itemCount)) error (SWT.ERROR_INVALID_RANGE);
if (itemCount == items.length) {
TaskItem [] newItems = new TaskItem [items.length + 4];
System.arraycopy (items, 0, newItems, 0, items.length);
items = newItems;
}
System.arraycopy (items, index, items, index + 1, itemCount++ - index);
items [index] = item;
}
void createItems () {
Shell [] shells = display.getShells ();
for (int i = 0; i < shells.length; i++) {
getItem (shells[i]);
}
getItem (null);
}
int /*long*/ createShellLink (MenuItem item, String directory) {
int style = item.getStyle ();
if ((style & SWT.CASCADE) != 0) return 0;
int /*long*/ [] ppv = new int /*long*/ [1];
int hr = OS.CoCreateInstance (CLSID_ShellLink, 0, OS.CLSCTX_INPROC_SERVER, IID_IShellLinkW, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_NO_HANDLES);
int /*long*/ pLink = ppv [0];
int /*long*/ hHeap = OS.GetProcessHeap ();
int /*long*/ pv = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, OS.PROPVARIANT_sizeof());
int /*long*/ titlePtr = 0;
PROPERTYKEY key;
if ((style & SWT.SEPARATOR) != 0) {
OS.MoveMemory (pv, new short [] {OS.VT_BOOL}, 2);
OS.MoveMemory (pv + 8, new short [] {OS.VARIANT_TRUE}, 2);
key = PKEY_AppUserModel_IsDestListSeparator;
} else {
String text = item.getText ();
int length = text.length ();
char [] buffer = new char [length + 1];
text.getChars (0, length, buffer, 0);
titlePtr = OS.HeapAlloc (hHeap, OS.HEAP_ZERO_MEMORY, buffer.length * 2);
OS.MoveMemory (titlePtr, buffer, buffer.length * 2);
OS.MoveMemory (pv, new short [] {OS.VT_LPWSTR}, 2);
OS.MoveMemory (pv + 8, new int /*long*/ [] {titlePtr}, OS.PTR_SIZEOF);
key = PKEY_Title;
/*IShellLink::SetPath*/
String exePath = (String)item.getData (EXE_PATH_KEY);
if (exePath != null) {
length = exePath.length ();
buffer = new char [length + 1];
exePath.getChars (0, length, buffer, 0);
} else {
buffer = EXE_PATH;
}
hr = OS.VtblCall (20, pLink, buffer);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
text = (String)item.getData (EXE_ARGS_KEY);
if (text == null) text = Display.LAUNCHER_PREFIX + Display.TASKBAR_EVENT + item.id;
length = text.length ();
buffer = new char [length + 1];
text.getChars (0, length, buffer, 0);
/*IShellLink::SetArguments*/
hr = OS.VtblCall (11, pLink, buffer);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
/* This code is intentionally commented */
// String tooltip = item.tooltip;
// if (tooltip != null) {
// length = tooltip.length ();
// buffer = new char [length + 1];
// tooltip.getChars (0, length, buffer, 0);
// /*IShellLink::SetDescription*/
// hr = OS.VtblCall (7, pLink, buffer);
// if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
// }
String icon = (String)item.getData (ICON_KEY);
int index = 0;
if (icon != null) {
text = (String)item.getData (ICON_INDEX_KEY);
if (text != null) index = Integer.parseInt (text);
} else {
Image image = item.getImage ();
if (image != null && directory != null) {
icon = directory + "\\menu" + item.id + ".ico" ;
ImageData data;
if (item.hBitmap != 0) {
Image image2 = Image.win32_new (display, SWT.BITMAP, item.hBitmap);
data = image2.getImageData ();
} else {
data = image.getImageData ();
}
ImageLoader loader = new ImageLoader ();
loader.data = new ImageData [] {data};
loader.save (icon, SWT.IMAGE_ICO);
}
}
if (icon != null) {
length = icon.length ();
buffer = new char [length + 1];
icon.getChars (0, length, buffer, 0);
/*IShellLink::SetIconLocation*/
hr = OS.VtblCall (17, pLink, buffer, index);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
}
}
/*IUnknown::QueryInterface*/
hr = OS.VtblCall (0, pLink, IID_IPropertyStore, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_NO_HANDLES);
int /*long*/ pPropStore = ppv [0];
/*IPropertyStore::SetValue*/
hr = OS.VtblCall (6, pPropStore, key, pv);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
/*IPropertyStore::Commit*/
OS.VtblCall (7, pPropStore);
/*IUnknown::Release*/
OS.VtblCall (2, pPropStore);
OS.HeapFree (hHeap, 0, pv);
if (titlePtr != 0) OS.HeapFree (hHeap, 0, titlePtr);
return pLink;
}
int /*long*/ createShellLinkArray (MenuItem [] items, String directory) {
if (items == null) return 0;
if (items.length == 0) return 0;
int /*long*/ [] ppv = new int /*long*/ [1];
int hr = OS.CoCreateInstance (CLSID_EnumerableObjectCollection, 0, OS.CLSCTX_INPROC_SERVER, IID_IObjectCollection, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_NO_HANDLES);
int /*long*/ pObjColl = ppv [0];
for (int i = 0; i < items.length; i++) {
int /*long*/ pLink = createShellLink (items[i], directory);
if (pLink != 0) {
/*IObjectCollection::AddObject*/
hr = OS.VtblCall (5, pObjColl, pLink);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
/*IUnknown::Release*/
OS.VtblCall (2, pLink);
}
}
/*IUnknown::QueryInterface*/
hr = OS.VtblCall (0, pObjColl, IID_IObjectArray, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_NO_HANDLES);
int /*long*/ poa = ppv [0];
/*IUnknown::Release*/
OS.VtblCall (2, pObjColl);
return poa;
}
void destroyItem (TaskItem item) {
int index = 0;
while (index < itemCount) {
if (items [index] == item) break;
index++;
}
if (index == itemCount) return;
System.arraycopy (items, index + 1, items, index, --itemCount - index);
items [itemCount] = null;
}
String getDirectory (char[] appName) {
char [] appDir = new char [appName.length];
for (int i = 0; i < appName.length; i++) {
char c = appName [i];
switch (c) {
case '\\':
case '/':
case ':':
case '*':
case '?':
case '\"':
case '<':
case '>':
case '|':
appDir [i] = '_';
break;
default:
appDir [i] = c;
}
}
String result = null;
int /*long*/ [] ppv = new int /*long*/ [1];
int hr = OS.SHCreateItemInKnownFolder (FOLDERID_LocalAppData, 0, null, IID_IShellItem, ppv);
if (hr == OS.S_OK) {
int /*long*/ psiRoot = ppv [0];
hr = OS.CoCreateInstance (CLSID_FileOperation, 0, OS.CLSCTX_INPROC_SERVER, IID_IFileOperation, ppv);
if (hr == OS.S_OK) {
int /*long*/ pfo = ppv [0];
/*IFileOperation.SetOperationFlags*/
hr = OS.VtblCall (5, pfo, OS.FOF_NO_UI);
if (hr == OS.S_OK) {
int /*long*/ psiAppDir = getDirectory (psiRoot, pfo, appDir, false);
if (psiAppDir != 0) {
int /*long*/ psiIcoDir = getDirectory (psiAppDir, pfo, ICO_DIR, true);
if (psiIcoDir != 0) {
/*IShellItem::GetDisplayName*/
hr = OS.VtblCall (5, psiIcoDir, OS.SIGDN_FILESYSPATH, ppv);
if (hr == OS.S_OK) {
int /*long*/ wstr = ppv [0];
int length = OS.wcslen (wstr);
char [] buffer = new char [length];
OS.MoveMemory (buffer, wstr, length * 2);
result = new String (buffer);
OS.CoTaskMemFree (wstr);
}
/*IUnknown::Release*/
OS.VtblCall (2, psiIcoDir);
}
/*IUnknown::Release*/
OS.VtblCall (2, psiAppDir);
}
}
/*IUnknown::Release*/
OS.VtblCall(2, pfo);
}
/*IUnknown::Release*/
OS.VtblCall (2, psiRoot);
}
return result;
}
int /*long*/ getDirectory (int /*long*/ parent, int /*long*/ pfo, char [] name, boolean delete) {
int /*long*/ [] ppv = new int /*long*/ [1];
int hr = OS.SHCreateItemFromRelativeName (parent, name, 0, IID_IShellItem, ppv);
if (hr == OS.S_OK) {
if (delete) {
/*IFileOperation.Delete*/
hr = OS.VtblCall (18, pfo, ppv [0], 0);
/*IUnknown::Release*/
OS.VtblCall (2, ppv [0]);
if (hr == OS.S_OK) {
/*IFileOperation.NewItem */
hr = OS.VtblCall (20, pfo, parent, OS.FILE_ATTRIBUTE_DIRECTORY, name, null, 0);
if (hr == OS.S_OK) {
/*IFileOperation.PerformOperations */
hr = OS.VtblCall (21, pfo);
if (hr == OS.S_OK) {
hr = OS.SHCreateItemFromRelativeName (parent, name, 0, IID_IShellItem, ppv);
if (hr == OS.S_OK) {
return ppv [0];
}
}
}
}
} else {
return ppv [0];
}
} else {
/*IFileOperation.NewItem */
hr = OS.VtblCall (20, pfo, parent, OS.FILE_ATTRIBUTE_DIRECTORY, name, null, 0);
if (hr == OS.S_OK) {
/*IFileOperation.PerformOperations */
hr = OS.VtblCall (21, pfo);
if (hr == OS.S_OK) {
hr = OS.SHCreateItemFromRelativeName (parent, name, 0, IID_IShellItem, ppv);
if (hr == OS.S_OK) {
return ppv [0];
}
}
}
}
return 0;
}
/**
* Returns the item at the given, zero-relative index in the
* receiver. Throws an exception if the index is out of range.
*
* @param index the index of the item to return
* @return the item at the given index
*
* @exception IllegalArgumentException
* - ERROR_INVALID_RANGE - if the index is not between 0 and the number of elements in the list minus 1 (inclusive)
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
public TaskItem getItem (int index) {
checkWidget ();
createItems ();
if (!(0 <= index && index < itemCount)) error (SWT.ERROR_INVALID_RANGE);
return items [index];
}
/**
* Returns the TaskItem
for the given Shell
or the TaskItem
* for the application if the Shell
parameter is null
.
* If the requested item is not supported by the platform it returns null
.
*
* @param shell the shell for which the task item is requested, or null to request the application item
* @return the task item for the given shell or the application
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
public TaskItem getItem (Shell shell) {
checkWidget ();
for (int i = 0; i < items.length; i++) {
if (items [i] != null && items [i].shell == shell) {
return items [i];
}
}
TaskItem item = new TaskItem (this, SWT.NONE);
if (shell != null) item.setShell (shell);
return item;
}
/**
* Returns the number of items contained in the receiver.
*
* @return the number of items
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
public int getItemCount () {
checkWidget ();
createItems ();
return itemCount;
}
/**
* Returns an array of TaskItem
s which are the items
* in the receiver.
*
* Note: This is not the actual structure used by the receiver
* to maintain its list of items, so modifying the array will
* not affect the receiver.
*
*
* @return the items in the receiver
*
* @exception SWTException
* - ERROR_WIDGET_DISPOSED - if the receiver has been disposed
* - ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
*
*/
public TaskItem [] getItems () {
checkWidget ();
createItems ();
TaskItem [] result = new TaskItem [itemCount];
System.arraycopy (items, 0, result, 0, result.length);
return result;
}
void releaseChildren (boolean destroy) {
if (items != null) {
for (int i=0; i 0) {
int length = appName.length ();
buffer = new char [length + 1];
appName.getChars (0, length, buffer, 0);
}
MenuItem [] items = null;
if (menu != null && (items = menu.getItems ()).length != 0) {
String directory = null;
for (int i = 0; i < items.length; i++) {
MenuItem item = items [i];
if (item.getImage () != null && item.getData (ICON_KEY) == null) {
directory = getDirectory (buffer);
break;
}
}
int /*long*/ poa = createShellLinkArray (items, directory);
if (poa != 0) {
/*ICustomDestinationList::SetAppID*/
hr = OS.VtblCall (3, pDestList, buffer);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
/*ICustomDestinationList::BeginList*/
int [] cMaxSlots = new int [1];
OS.VtblCall (4, pDestList, cMaxSlots, IID_IObjectArray, ppv);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
int /*long*/ pRemovedItems = ppv [0];
int [] count = new int [1];
/*IObjectArray::GetCount*/
OS.VtblCall (3, poa, count);
if (count [0] != 0) {
/*ICustomDestinationList::AddUserTasks*/
hr = OS.VtblCall (7, pDestList, poa);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
}
for (int i = 0; i < items.length; i++) {
MenuItem item = items [i];
if ((item.getStyle () & SWT.CASCADE) != 0) {
Menu subMenu = item.getMenu ();
if (subMenu != null) {
MenuItem [] subItems = subMenu.getItems ();
if (directory == null) {
for (int j = 0; j < subItems.length; j++) {
MenuItem subItem = subItems [j];
if (subItem.getImage () != null && subItem.getData (ICON_KEY) == null) {
directory = getDirectory (buffer);
break;
}
}
}
int /*long*/ poa2 = createShellLinkArray (subItems, directory);
if (poa2 != 0) {
/*IObjectArray::GetCount*/
OS.VtblCall (3, poa2, count);
if (count [0] != 0) {
String text = item.getText ();
int length = text.length ();
char [] buffer2 = new char [length + 1];
text.getChars (0, length, buffer2, 0);
/*ICustomDestinationList::AppendCategory*/
hr = OS.VtblCall (5, pDestList, buffer2, poa2);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
}
/*IUnknown::Release*/
OS.VtblCall (2, poa2);
}
}
}
}
/*ICustomDestinationList::CommitList*/
hr = OS.VtblCall (8, pDestList);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
/*IUnknown::Release*/
if (pRemovedItems != 0) OS.VtblCall (2, pRemovedItems);
/*IUnknown::Release*/
OS.VtblCall (2, poa);
}
} else {
/*ICustomDestinationList::DeleteList*/
hr = OS.VtblCall (10, pDestList, buffer);
if (hr != OS.S_OK) error (SWT.ERROR_INVALID_ARGUMENT);
}
/*IUnknown::Release*/
OS.VtblCall (2, pDestList);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy