/******************************************************************************* * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.swt.widgets; import org.eclipse.swt.internal.photon.*; import org.eclipse.swt.*; import org.eclipse.swt.graphics.*; /** * Instances of this class are controls which are capable * of containing other controls. *
*
Styles:
*
NO_BACKGROUND, NO_FOCUS, NO_MERGE_PAINTS, NO_REDRAW_RESIZE, NO_RADIO_GROUP, EMBEDDED
*
Events:
*
(none)
*
*

* Note: The NO_BACKGROUND, NO_FOCUS, NO_MERGE_PAINTS, * and NO_REDRAW_RESIZE styles are intended for use with Canvas. * They can be used with Composite if you are drawing your own, but their * behavior is undefined if they are used with subclasses of Composite other * than Canvas. *

* This class may be subclassed by custom control implementors * who are building controls that are constructed from aggregates * of other controls. *

* * @see Canvas */ public class Composite extends Scrollable { Layout layout; Control [] tabList; int cornerHandle; Composite () { /* Do nothing */ } /** * Constructs a new instance of this class given its parent * and a style value describing its behavior and appearance. *

* The style value is either one of the style constants defined in * class SWT which is applicable to instances of this * class, or must be built by bitwise OR'ing together * (that is, using the int "|" operator) two or more * of those SWT style constants. The class description * lists the style constants that are applicable to the class. * Style bits are also inherited from superclasses. *

* * @param parent a widget which will be the parent of the new instance (cannot be null) * @param style the style of widget to construct * * @exception IllegalArgumentException * @exception SWTException * * @see SWT#NO_BACKGROUND * @see SWT#NO_FOCUS * @see SWT#NO_MERGE_PAINTS * @see SWT#NO_REDRAW_RESIZE * @see SWT#NO_RADIO_GROUP * @see Widget#getStyle */ public Composite (Composite parent, int style) { super (parent, style); } Control [] _getChildren () { int count = 0; int parentHandle = parentingHandle (); int child = OS.PtWidgetChildFront (parentHandle); while (child != 0) { child = OS.PtWidgetBrotherBehind (child); count++; } Control [] children = new Control [count]; int i = 0, j = 0; child = OS.PtWidgetChildFront (parentHandle); while (i < count) { Widget widget = WidgetTable.get (child); if (widget != null && widget != this) { if (widget instanceof Control) { children [j++] = (Control) widget; } } i++; child = OS.PtWidgetBrotherBehind (child); } if (i == j) return children; Control [] newChildren = new Control [j]; System.arraycopy (children, 0, newChildren, 0, j); return newChildren; } Control [] _getTabList () { if (tabList == null) return tabList; int count = 0; for (int i=0; i 6 || (OS.QNX_MAJOR == 6 && (OS.QNX_MINOR > 2 || (OS.QNX_MINOR == 2 && OS.QNX_MICRO >= 1))))) { /* Get the clipping tiles for children and siblings */ int clip_tile = getClipping (handle, topHandle (), true, true); if (clip_tile == 0) return; /* Translate the clipping to the current GC coordinates */ short [] abs_x = new short [1], abs_y = new short [1]; OS.PtGetAbsPosition (handle, abs_x, abs_y); short [] dis_abs_x = new short [1], dis_abs_y = new short [1]; OS.PtGetAbsPosition (OS.PtFindDisjoint (handle), dis_abs_x, dis_abs_y); PhPoint_t delta = new PhPoint_t (); delta.x = (short) (abs_x [0] - dis_abs_x [0]); delta.y = (short) (abs_y [0] - dis_abs_y [0]); OS.PhTranslateTiles(clip_tile, delta); /* Set the clipping */ int[] clip_rects_count = new int [1]; int clip_rects = OS.PhTilesToRects (clip_tile, clip_rects_count); OS.PhFreeTiles (clip_tile); if (clip_rects_count [0] == 0) { clip_rects_count [0] = 1; OS.free (clip_rects); clip_rects = OS.malloc (PhRect_t.sizeof); OS.memset(clip_rects, 0, PhRect_t.sizeof); } OS.PgSetMultiClip (clip_rects_count[0], clip_rects); OS.free (clip_rects); } /* Draw the widget */ super.drawWidget (widget, damage); if (!(OS.QNX_MAJOR > 6 || (OS.QNX_MAJOR == 6 && (OS.QNX_MINOR > 2 || (OS.QNX_MINOR == 2 && OS.QNX_MICRO >= 1))))) { /* Reset the clipping */ OS.PgSetMultiClip (0, 0); } } } else { super.drawWidget (widget, damage); } } public boolean forceFocus () { checkWidget(); if ((state & CANVAS) == 0) return super.forceFocus (); /* * Bug in Photon. PtContainerGiveFocus() is supposed to give * focus to the widget even if the widget's Pt_GET_FOCUS flag * is not set. This does not happen when the widget is a * PtContainer. The fix is to set the flag before calling it. */ int flags = OS.PtWidgetFlags (handle); OS.PtSetResource (handle, OS.Pt_ARG_FLAGS, OS.Pt_GETS_FOCUS, OS.Pt_GETS_FOCUS); boolean result = super.forceFocus (); OS.PtSetResource (handle, OS.Pt_ARG_FLAGS, flags, OS.Pt_GETS_FOCUS); return result; } public Rectangle getClientArea () { checkWidget(); if (scrolledHandle == 0) return super.getClientArea (); PhArea_t area = new PhArea_t (); OS.PtWidgetArea (handle, area); return new Rectangle (area.pos_x, area.pos_y, area.size_w, area.size_h); } int getClipping(int widget, int topWidget, boolean clipChildren, boolean clipSiblings) { int child_tile = 0; int widget_tile = OS.PhGetTile(); // NOTE: PhGetTile native initializes the tile PhRect_t rect = new PhRect_t (); int args [] = {OS.Pt_ARG_FLAGS, 0, 0, OS.Pt_ARG_BASIC_FLAGS, 0, 0}; /* Get the rectangle of all siblings in front of the widget */ if (clipSiblings && OS.PtWidgetClass(topWidget) != OS.PtWindow()) { int temp_widget = topWidget; while ((temp_widget = OS.PtWidgetBrotherInFront(temp_widget)) != 0) { if (OS.PtWidgetIsRealized(temp_widget)) { int tile = OS.PhGetTile(); if (child_tile == 0) child_tile = tile; else child_tile = OS.PhAddMergeTiles(tile, child_tile, null); OS.PtWidgetExtent(temp_widget, tile); // NOTE: tile->rect args [1] = args [4] = 0; OS.PtGetResources(temp_widget, args.length / 3, args); if ((args [1] & OS.Pt_HIGHLIGHTED) != 0) { int basic_flags = args [4]; OS.memmove(rect, tile, PhRect_t.sizeof); if ((basic_flags & OS.Pt_TOP_ETCH) != 0) rect.ul_y++; if ((basic_flags & OS.Pt_BOTTOM_ETCH) != 0) rect.lr_y--; if ((basic_flags & OS.Pt_RIGHT_ETCH) != 0) rect.ul_x++; if ((basic_flags & OS.Pt_LEFT_ETCH) != 0) rect.lr_x--; OS.memmove(tile, rect, PhRect_t.sizeof); } } } /* Translate the siblings rectangles to the widget's coordinates */ OS.PtWidgetCanvas(topWidget, widget_tile); // NOTE: widget_tile->rect OS.PhDeTranslateTiles(child_tile, widget_tile); // NOTE: widget_tile->rect.ul } /* Get the rectangle of the widget's children */ if (clipChildren) { int temp_widget = OS.PtWidgetChildBack(widget); while (temp_widget != 0) { if (OS.PtWidgetIsRealized(temp_widget)) { int tile = OS.PhGetTile(); if (child_tile == 0) child_tile = tile; else child_tile = OS.PhAddMergeTiles(tile, child_tile, null); OS.PtWidgetExtent(temp_widget, tile); // NOTE: tile->rect args [1] = args [4] = 0; OS.PtGetResources(temp_widget, args.length / 3, args); if ((args [1] & OS.Pt_HIGHLIGHTED) != 0) { int basic_flags = args [4]; OS.memmove(rect, tile, PhRect_t.sizeof); if ((basic_flags & OS.Pt_TOP_ETCH) != 0) rect.ul_y++; if ((basic_flags & OS.Pt_BOTTOM_ETCH) != 0) rect.lr_y--; if ((basic_flags & OS.Pt_RIGHT_ETCH) != 0) rect.ul_x++; if ((basic_flags & OS.Pt_LEFT_ETCH) != 0) rect.lr_x--; OS.memmove(tile, rect, PhRect_t.sizeof); } } temp_widget = OS.PtWidgetBrotherInFront(temp_widget); } } /* Get the widget's rectangle */ OS.PtWidgetCanvas(widget, widget_tile); // NOTE: widget_tile->rect OS.PhDeTranslateTiles(widget_tile, widget_tile); // NOTE: widget_tile->rect.ul /* Clip the widget's rectangle from the child/siblings rectangle's */ if (child_tile != 0) { int clip_tile = OS.PhClipTilings(widget_tile, child_tile, null); OS.PhFreeTiles(child_tile); return clip_tile; } return widget_tile; } /** * Returns an array containing the receiver's children. *

* Note: This is not the actual structure used by the receiver * to maintain its list of children, so modifying the array will * not affect the receiver. *

* * @return an array of children * * @exception SWTException */ public Control [] getChildren () { checkWidget(); return _getChildren (); } int getChildrenCount () { int count = 0; int parentHandle = parentingHandle (); int child = OS.PtWidgetChildFront (parentHandle); while (child != 0) { child = OS.PtWidgetBrotherBehind (child); count++; } return count; } /** * Returns layout which is associated with the receiver, or * null if one has not been set. * * @return the receiver's layout or null * * @exception SWTException */ public Layout getLayout () { checkWidget(); return layout; } boolean hasBorder () { return (style & SWT.BORDER) != 0; } boolean hasFocus () { return OS.PtIsFocused (handle) == 2; } boolean hooksKeys () { return hooks (SWT.KeyDown) || hooks (SWT.KeyUp); } /** * Gets the last specified tabbing order for the control. * * @return tabList the ordered list of controls representing the tab order * * @exception SWTException * * @see #setTabList */ public Control [] getTabList () { checkWidget (); Control [] tabList = _getTabList (); if (tabList == null) { int count = 0; Control [] list =_getChildren (); for (int i=0; ilay out * (that is, set the size and location of) the receiver's children. * If the receiver does not have a layout, do nothing. *

* This is equivalent to calling layout(true). *

* * @exception SWTException */ public void layout () { checkWidget(); layout (true); } Point minimumSize () { Control [] children = _getChildren (); int width = 0, height = 0; for (int i=0; ilay out * (that is, set the size and location of) the receiver's children. * If the the argument is true the layout must not rely * on any cached information it is keeping about the children. If it * is false the layout may (potentially) simplify the * work it is doing by assuming that the state of the none of the * receiver's children has changed since the last layout. * If the receiver does not have a layout, do nothing. * * @param changed true if the layout must flush its caches, and false otherwise * * @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 void layout (boolean changed) { checkWidget(); if (layout == null) return; int count = getChildrenCount (); if (count == 0) return; layout.layout (this, changed); } int parentingHandle () { return handle; } int Ph_EV_BUT_PRESS (int widget, int info) { int result = super.Ph_EV_BUT_PRESS (widget, info); if (result != OS.Pt_CONTINUE)return result; if ((state & CANVAS) != 0) { /* Set focus for a CANVAS with no children */ if ((style & SWT.NO_FOCUS) == 0 && hooksKeys ()) { if (OS.PtWidgetChildFront (handle) == 0) { if (info == 0) return OS.Pt_END; PtCallbackInfo_t cbinfo = new PtCallbackInfo_t (); OS.memmove (cbinfo, info, PtCallbackInfo_t.sizeof); if (cbinfo.event == 0) return OS.Pt_END; PhEvent_t ev = new PhEvent_t (); OS.memmove (ev, cbinfo.event, PhEvent_t.sizeof); int data = OS.PhGetData (cbinfo.event); if (data == 0) return OS.Pt_END; PhPointerEvent_t pe = new PhPointerEvent_t (); OS.memmove (pe, data, PhPointerEvent_t.sizeof); if (pe.buttons == OS.Ph_BUTTON_SELECT) setFocus (); } } } return result; } int Pt_CB_OUTBOUND (int widget, int info) { if ((state & CANVAS) != 0) { if (info == 0) return OS.Pt_END; PtCallbackInfo_t cbinfo = new PtCallbackInfo_t (); OS.memmove (cbinfo, info, PtCallbackInfo_t.sizeof); if (cbinfo.event == 0) return OS.Pt_END; PhEvent_t ev = new PhEvent_t (); OS.memmove (ev, cbinfo.event, PhEvent_t.sizeof); int data = OS.PhGetData (cbinfo.event); if (data == 0) return OS.Pt_END; PhPointerEvent_t pe = new PhPointerEvent_t (); OS.memmove (pe, data, PhPointerEvent_t.sizeof); /* Grab pointer */ PhRect_t rect = new PhRect_t (); PhPoint_t pos = new PhPoint_t (); pos.x = pe.pos_x; pos.y = pe.pos_y; rect.ul_x = rect.lr_x = (short) (pos.x + ev.translation_x); rect.ul_y = rect.lr_y = (short) (pos.y + ev.translation_y); int rid = OS.PtWidgetRid (handle); int input_group = OS.PhInputGroup (0); int flags = OS.Ph_DRAG_KEY_MOTION | OS.Ph_DRAG_TRACK | OS.Ph_TRACK_DRAG; OS.PhInitDrag (rid, flags, rect, null, input_group, null, null, null, pos, null); /* Post drag detect event */ Event event = new Event (); event.x = display.dragStartX; event.y = display.dragStartY; postEvent (SWT.DragDetect, event); } return OS.Pt_CONTINUE; } void releaseChildren () { Control [] children = _getChildren (); for (int i=0; i *
  • ERROR_WIDGET_DISPOSED - if the receiver has been disposed
  • *
  • ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver
  • * */ public void setLayout (Layout layout) { checkWidget(); this.layout = layout; } boolean setTabGroupFocus () { if (isTabItem ()) return setTabItemFocus (); boolean takeFocus = (style & SWT.NO_FOCUS) == 0; if ((state & CANVAS) != 0) takeFocus = hooksKeys (); if (takeFocus && setTabItemFocus ()) return true; Control [] children = _getChildren (); for (int i=0; i *
  • ERROR_INVALID_ARGUMENT - if a widget in the tabList is null or has been disposed
  • *
  • ERROR_INVALID_PARENT - if widget in the tabList is not in the same widget tree
  • * * @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 void setTabList (Control [] tabList) { checkWidget (); if (tabList == null) error (SWT.ERROR_NULL_ARGUMENT); for (int i=0; i