From: Richard K. <ric...@us...> - 2005-05-21 04:23:52
|
Update of /cvsroot/actionstep/actionstep/src/org/actionstep In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv5256 Modified Files: NSScroller.as NSRect.as Log Message: implementing NSScroller Index: NSRect.as =================================================================== RCS file: /cvsroot/actionstep/actionstep/src/org/actionstep/NSRect.as,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** NSRect.as 14 May 2005 04:45:50 -0000 1.4 --- NSRect.as 21 May 2005 04:23:43 -0000 1.5 *************** *** 57,68 **** } - public function insetRect(dx:Number, dy:Number):NSRect { - return new NSRect(origin.x + dx, origin.y + dy, size.width - 2*dx, size.height - 2*dy); - } - - public function isEmptyRect():Boolean { - return (size.width == 0) && (size.height == 0); - } - public function midX():Number { return origin.x + size.width/2; --- 57,60 ---- *************** *** 73,76 **** --- 65,104 ---- } + public function minX():Number { + return origin.x; + } + + public function minY():Number { + return origin.y; + } + + public function maxX():Number { + return origin.x + size.width; + } + + public function maxY():Number { + return origin.y + size.height; + } + + public function width():Number { + return size.width; + } + + public function height():Number { + return size.height; + } + + public function insetRect(dx:Number, dy:Number):NSRect { + return new NSRect(origin.x + dx, origin.y + dy, size.width - 2*dx, size.height - 2*dy); + } + + public function offsetRect(dx:Number, dy:Number):NSRect { + return new NSRect(origin.x + dx, origin.y + dy, size.width, size.height); + } + + public function isEmptyRect():Boolean { + return (size.width == 0) && (size.height == 0); + } + public function pointInRect(point:NSPoint):Boolean { if ( (point.x > origin.x && point.x < (origin.x+size.width)) && Index: NSScroller.as =================================================================== RCS file: /cvsroot/actionstep/actionstep/src/org/actionstep/NSScroller.as,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** NSScroller.as 17 May 2005 04:25:36 -0000 1.1 --- NSScroller.as 21 May 2005 04:23:43 -0000 1.2 *************** *** 30,51 **** import org.actionstep.NSControl; import org.actionstep.constants.NSScrollerPart; import org.actionstep.constants.NSControlSize; import org.actionstep.constants.NSScrollArrowPosition; import org.actionstep.constants.NSControlTint; ! import org.actionstep.NSRect; class org.actionstep.NSScroller extends NSControl { ! private static var DEFAULT_SCROLLER_WIDTH:Number = 16; private var m_hitPart:NSScrollerPart; private var m_arrowsPosition:NSScrollArrowPosition; private var m_knobProportion:Number; private var m_controlTint:NSControlTint; private var m_target:Object; private var m_action:String; - // Determining NSScroller size public static function scrollerWidth():Number { return DEFAULT_SCROLLER_WIDTH; --- 30,76 ---- import org.actionstep.NSControl; + import org.actionstep.NSRect; + import org.actionstep.NSSize; + import org.actionstep.NSPoint; + import org.actionstep.NSCell; + import org.actionstep.NSImage; + import org.actionstep.NSEvent; + import org.actionstep.NSButtonCell; + import org.actionstep.constants.NSScrollerPart; import org.actionstep.constants.NSControlSize; import org.actionstep.constants.NSScrollArrowPosition; import org.actionstep.constants.NSControlTint; ! import org.actionstep.constants.NSCellImagePosition; ! import org.actionstep.constants.NSUsableScrollerParts; ! import org.actionstep.constants.NSBezelStyle; class org.actionstep.NSScroller extends NSControl { ! private static var DEFAULT_SCROLLER_WIDTH:Number = 20; ! private static var BUTTON_WIDTH:Number = 18; ! ! private static var g_upCell:NSButtonCell; ! private static var g_downCell:NSButtonCell; ! private static var g_leftCell:NSButtonCell; ! private static var g_rightCell:NSButtonCell; private var m_hitPart:NSScrollerPart; private var m_arrowsPosition:NSScrollArrowPosition; + private var m_floatValue:Number; + private var m_usableParts:NSUsableScrollerParts; private var m_knobProportion:Number; + private var m_pendingKnobProportion:Number; private var m_controlTint:NSControlTint; private var m_target:Object; private var m_action:String; + private var m_enabled:Boolean; + + private var m_horizontal:Boolean; + + public function NSScroller() { + m_enabled = true; + } public static function scrollerWidth():Number { return DEFAULT_SCROLLER_WIDTH; *************** *** 61,67 **** public function initWithFrame(rect:NSRect):NSScroller { return this; } ! public function setControlSize(size:NSControlSize) { --- 86,120 ---- public function initWithFrame(rect:NSRect):NSScroller { + if (rect.size.width > rect.size.height) { + m_horizontal = true; + rect.size.height = scrollerWidth(); + } else { + m_horizontal = false; + rect.size.width = scrollerWidth(); + } + super.initWithFrame(rect); + m_arrowsPosition = NSScrollArrowPosition.NSScrollerArrowsDefaultSetting; + if (m_horizontal) { + m_floatValue = 0.0; + } else { + m_floatValue = 1.0; + } + m_hitPart = NSScrollerPart.NSScrollerNoPart; + drawParts(); + setEnabled(false); + checkSpaceForParts(); return this; } ! ! // Enabling and disabling the control ! ! public function setEnabled(value:Boolean) { ! m_enabled = value; ! setNeedsDisplay(true); ! } ! ! public function isEnabled():Boolean { ! return m_enabled; ! } public function setControlSize(size:NSControlSize) { *************** *** 88,95 **** } // Setting the knob position ! public function setFloatValueKnobProportion(floatValue:Number, knobProportion:Number) { ! //! Implmement } --- 141,217 ---- } + public function setFrame(rect:NSRect) { + if (rect.size.width > rect.size.height) { + m_horizontal = true; + rect.size.height = scrollerWidth(); + } else { + m_horizontal = false; + rect.size.width = scrollerWidth(); + } + super.setFrame(rect); + if (m_arrowsPosition != NSScrollArrowPosition.NSScrollerArrowsNone) { + m_arrowsPosition = NSScrollArrowPosition.NSScrollerArrowsDefaultSetting; + } + m_hitPart = NSScrollerPart.NSScrollerNoPart; + checkSpaceForParts(); + } + + public function setFrameSize(size:NSSize) { + if (size.width > size.height) { + m_horizontal = true; + size.height = scrollerWidth(); + } else { + m_horizontal = false; + size.width = scrollerWidth(); + } + super.setFrameSize(size); + if (m_arrowsPosition != NSScrollArrowPosition.NSScrollerArrowsNone) { + m_arrowsPosition = NSScrollArrowPosition.NSScrollerArrowsDefaultSetting; + } + setNeedsDisplay(true); + checkSpaceForParts(); + } + + // Setting the knob position ! public function setFloatValue(value:Number) { ! if (m_floatValue == value) { ! return; ! } ! if (value < 0) { ! m_floatValue = 0; ! } ! if (value > 1) { ! m_floatValue = 1; ! } ! m_floatValue = value; ! setNeedsDisplay(true); ! } ! ! public function setFloatValueKnobProportion(value:Number, knobProportion:Number) { ! if (m_floatValue == value && m_knobProportion == knobProportion) { ! return; ! } ! if (knobProportion < 0) { ! m_pendingKnobProportion = 0; ! } else if (knobProportion > 1) { ! m_pendingKnobProportion = 1; ! } else { ! m_pendingKnobProportion = knobProportion; ! } ! if (m_hitPart == NSScrollerPart.NSScrollerNoPart) { ! m_knobProportion = m_pendingKnobProportion; ! m_pendingKnobProportion = 0; ! } ! if (m_knobProportion == 1) { ! setEnabled(false); ! } else { ! setEnabled(true); ! } ! if (m_hitPart != NSScrollerPart.NSScrollerKnobSlot && m_hitPart != NSScrollerPart.NSScrollerKnob) { ! m_floatValue = -1; ! setFloatValue(value); ! } } *************** *** 100,105 **** --- 222,421 ---- // Calculating layout + public function rectForPart(part:NSScrollerPart):NSRect { + var scrollerFrame = m_frame.clone(); + var x:Number, y:Number, width:Number, height:Number; + var buttonsSize = 2*BUTTON_WIDTH+2; + var usableParts:NSUsableScrollerParts; + + if (!m_enabled) { + usableParts = NSUsableScrollerParts.NSNoScrollerParts; + } else { + usableParts = m_usableParts; + } + + // reverse width/height based on orientation + if (m_horizontal) { + width = scrollerFrame.size.height - 2; + height = scrollerFrame.size.width - 2; + } else { + width = scrollerFrame.size.width - 2; + height = scrollerFrame.size.height - 2; + } + + switch(part) { + case NSScrollerPart.NSScrollerKnob: + if (usableParts == NSUsableScrollerParts.NSNoScrollerParts || + m_arrowsPosition == NSUsableScrollerParts.NSOnlyScrollerArrows) { + return NSRect.ZeroRect; + } + var slotHeight = height - + (m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone ? 0 : buttonsSize); + var knobHeight = Math.floor(m_knobProportion * slotHeight); + if (knobHeight < BUTTON_WIDTH) { + knobHeight = BUTTON_WIDTH; + } + var knobPosition = Math.floor(m_floatValue * (slotHeight - knobHeight)); + if (m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone) { + y += knobPosition; + } else { + y += knobPosition + BUTTON_WIDTH; + } + height = knobHeight; + width = BUTTON_WIDTH; + break; + case NSScrollerPart.NSScrollerKnobSlot: + if (usableParts == NSUsableScrollerParts.NSNoScrollerParts || + m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone) { + break; + } + height -= buttonsSize; + y += BUTTON_WIDTH+1; + break; + case NSScrollerPart.NSScrollerDecrementLine: + case NSScrollerPart.NSScrollerDecrementPage: + if (usableParts == NSUsableScrollerParts.NSNoScrollerParts || + m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone) { + return NSRect.ZeroRect; + } + y += (height - BUTTON_WIDTH+1); + width = BUTTON_WIDTH; + height = BUTTON_WIDTH; + break; + case NSScrollerPart.NSScrollerIncrementLine: + case NSScrollerPart.NSScrollerIncrementPage: + if (usableParts == NSUsableScrollerParts.NSNoScrollerParts || + m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone) { + return NSRect.ZeroRect; + } + width = BUTTON_WIDTH; + height = BUTTON_WIDTH; + break; + case NSScrollerPart.NSScrollerNoPart: + return NSRect.ZeroRect; + } + // Reverse y/x & height/width based on orientation + if (m_horizontal) { + return new NSRect(y,x,height,width); + } else { + return new NSRect(x,y,width,height); + } + } + + public function testPart(point:NSPoint):NSScrollerPart { + var rect:NSRect; + point = convertPointFromView(point); + if (point.x <= 0 || point.x >=m_frame.size.width || + point.y <= 0 || point.y >=m_frame.size.height) { + return NSScrollerPart.NSScrollerNoPart; + } + rect = rectForPart(NSScrollerPart.NSScrollerDecrementLine); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerDecrementLine; + } + + rect = rectForPart(NSScrollerPart.NSScrollerIncrementLine); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerIncrementLine; + } + + rect = rectForPart(NSScrollerPart.NSScrollerKnob); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerKnob; + } + + rect = rectForPart(NSScrollerPart.NSScrollerIncrementPage); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerIncrementPage; + } + + rect = rectForPart(NSScrollerPart.NSScrollerDecrementPage); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerDecrementPage; + } + + rect = rectForPart(NSScrollerPart.NSScrollerKnobSlot); + if (rect.pointInRect(point)) { + return NSScrollerPart.NSScrollerKnobSlot; + } + + return NSScrollerPart.NSScrollerNoPart + } + + public function checkSpaceForParts() { + var frameSize = m_frame.size; + var size = (m_horizontal ? frameSize.width : frameSize.height); + + if (m_arrowsPosition == NSScrollArrowPosition.NSScrollerArrowsNone) { + if (size > BUTTON_WIDTH + 3) { + m_usableParts = NSUsableScrollerParts.NSAllScrollerParts; + } else { + m_usableParts = NSUsableScrollerParts.NSNoScrollerParts; + } + } else { + if (size >= 5 + BUTTON_WIDTH * 3) { + m_usableParts = NSUsableScrollerParts.NSAllScrollerParts; + } else if (size >= 3 + BUTTON_WIDTH * 2) { + m_usableParts = NSUsableScrollerParts.NSOnlyScrollerArrows; + } else { + m_usableParts = NSUsableScrollerParts.NSNoScrollerParts; + } + } + } + + public function usableParts():NSUsableScrollerParts { + return m_usableParts; + } + // Drawing the parts + public function isOpaque():Boolean { + return true; + } + + public function drawParts() { + if (g_upCell != null) { + return; + } + g_upCell = new NSButtonCell(); + g_upCell.setHighlightsBy(NSCell.NSChangeBackgroundCellMask | NSCell.NSContentsCellMask); + g_upCell.setImage(NSImage.imageNamed("NSScrollerUpArrow")); + g_upCell.setAlternateImage(NSImage.imageNamed("NSHightlightedScrollerUpArrow")); + g_upCell.setImagePosition(NSCellImagePosition.NSImageOnly); + g_upCell.setContinuous(true); + g_upCell.sendActionOn(NSEvent.NSLeftMouseDownMask | NSEvent.NSPeriodicMask); + g_upCell.setPeriodicDelayInterval(.3, .03); + g_upCell.setBezelStyle(NSBezelStyle.NSShadowlessSquareBezelStyle); + + g_downCell = new NSButtonCell(); + g_downCell.setHighlightsBy(NSCell.NSChangeBackgroundCellMask | NSCell.NSContentsCellMask); + g_downCell.setImage(NSImage.imageNamed("NSScrollerDownArrow")); + g_downCell.setAlternateImage(NSImage.imageNamed("NSHightlightedScrollerDownArrow")); + g_downCell.setImagePosition(NSCellImagePosition.NSImageOnly); + g_downCell.setContinuous(true); + g_downCell.sendActionOn(NSEvent.NSLeftMouseDownMask | NSEvent.NSPeriodicMask); + g_downCell.setPeriodicDelayInterval(.3, .03); + g_downCell.setBezelStyle(NSBezelStyle.NSShadowlessSquareBezelStyle); + + g_leftCell = new NSButtonCell(); + g_leftCell.setHighlightsBy(NSCell.NSChangeBackgroundCellMask | NSCell.NSContentsCellMask); + g_leftCell.setImage(NSImage.imageNamed("NSScrollerLeftArrow")); + g_leftCell.setAlternateImage(NSImage.imageNamed("NSHightlightedScrollerLeftArrow")); + g_leftCell.setImagePosition(NSCellImagePosition.NSImageOnly); + g_leftCell.setContinuous(true); + g_leftCell.sendActionOn(NSEvent.NSLeftMouseDownMask | NSEvent.NSPeriodicMask); + g_leftCell.setPeriodicDelayInterval(.3, .03); + g_leftCell.setBezelStyle(NSBezelStyle.NSShadowlessSquareBezelStyle); + + g_rightCell = new NSButtonCell(); + g_rightCell.setHighlightsBy(NSCell.NSChangeBackgroundCellMask | NSCell.NSContentsCellMask); + g_rightCell.setImage(NSImage.imageNamed("NSScrollerRightArrow")); + g_rightCell.setAlternateImage(NSImage.imageNamed("NSHightlightedScrollerRightArrow")); + g_rightCell.setImagePosition(NSCellImagePosition.NSImageOnly); + g_rightCell.setContinuous(true); + g_rightCell.sendActionOn(NSEvent.NSLeftMouseDownMask | NSEvent.NSPeriodicMask); + g_rightCell.setPeriodicDelayInterval(.3, .03); + g_rightCell.setBezelStyle(NSBezelStyle.NSShadowlessSquareBezelStyle); + } + // Event handling *************** *** 131,135 **** m_target = target; } ! // Setting control tint --- 447,514 ---- m_target = target; } ! ! private function floatValueAtPoint(point:NSPoint):Number { ! var knobRect:NSRect = rectForPart(NSScrollerPart.NSScrollerKnob); ! var slotRect:NSRect = rectForPart(NSScrollerPart.NSScrollerKnobSlot); ! var position:Number; ! var min_pos:Number; ! var max_pos:Number; ! ! if (m_horizontal) { ! min_pos = slotRect.minX() + knobRect.size.width/2 ! min_pos = slotRect.maxX() + knobRect.size.width/2 ! position = point.x; ! } else { ! min_pos = slotRect.minY() + knobRect.size.height/2 ! min_pos = slotRect.maxY() + knobRect.size.height/2 ! position = point.y; ! } ! if (position <= min_pos) { ! return 0; ! } ! if (position >= max_pos) { ! return 1; ! } ! return (position - min_pos) / (max_pos - min_pos); ! } ! ! public function mouseDown(event:NSEvent) { ! var location:NSPoint = event.locationInWindow; ! m_hitPart = testPart(location); ! setButtonCellTargets(); ! switch(m_hitPart) { ! case NSScrollerPart.NSScrollerIncrementPage: ! case NSScrollerPart.NSScrollerIncrementLine: ! case NSScrollerPart.NSScrollerDecrementPage: ! case NSScrollerPart.NSScrollerDecrementLine: ! trackScrollButtons(event); ! break; ! case NSScrollerPart.NSScrollerKnob: ! trackKnob(event); ! break ! case NSScrollerPart.NSScrollerKnobSlot: ! var floatValue = floatValueAtPoint(convertPointFromView(location, null)); ! if (m_floatValue != floatValue) { ! setFloatValue(floatValue); ! sendActionTo(m_action, m_target); ! } ! trackKnob(event); ! break; ! case NSScrollerPart.NSScrollerNoPart: ! break; ! } ! m_hitPart = NSScrollerPart.NSScrollerNoPart; ! if (m_pendingKnobProportion != 0) { ! setFloatValueKnobProportion(m_floatValue, m_pendingKnobProportion); ! } else { ! setNeedsDisplay(true); ! } ! } ! ! private function trackKnob(event:NSEvent) { ! } ! ! private function trackScrollButtons(event) { ! } // Setting control tint *************** *** 143,145 **** --- 522,537 ---- } + // PRIVATE FUNCTIONS + + private function setButtonCellTargets() { + g_upCell.setTarget(m_target); + g_upCell.setAction(m_action); + g_downCell.setTarget(m_target); + g_downCell.setAction(m_action); + g_leftCell.setTarget(m_target); + g_leftCell.setAction(m_action); + g_rightCell.setTarget(m_target); + g_rightCell.setAction(m_action); + } + } \ No newline at end of file |