Drag-and-Drop(Chapter 23 of Cocoa Programming for Mac OS X)

#import  " BigLetterView.h "


@implementation BigLetterView

-  (NSDragOperation)draggingSourceOperationMaskForLocal:(BOOL)isLocal
{
    
return  NSDragOperationCopy  |  NSDragOperationDelete;
}

-  (NSDragOperation)draggingUpdated:(id  < NSDraggingInfo > )sender
{
    NSDragOperation op 
=  [sender draggingSourceOperationMask];
    NSLog(
@" operation mask = %d " , op);
    
if  ([sender draggingSource]  ==  self) 
    {
        
return  NSDragOperationNone;
    }
    
    
return  NSDragOperationCopy;
}

-  ( void )mouseDown:(NSEvent  * ) event
{
    [
event  retain];
    [mouseDownEvent release];
    mouseDownEvent 
=   event ;
}

-  ( void )mouseDragged:(NSEvent  * ) event
{
    NSPoint down 
=  [mouseDownEvent locationInWindow];
    NSPoint drag 
=  [ event  locationInWindow];
    
float  distance  =  hypot(down.x - drag.x, down.y - drag.y);
    
if (distance  <   3 )
    {
        
return ;
    }
    
    
if ([ string  length]  ==   0 )
    {
        
return ;
    }
    
    NSSize s 
=  [ string  sizeWithAttributes:attributes];
    NSImage 
* anImage  =  [[NSImage alloc] initWithSize:s];
    NSRect imageBounds;
    imageBounds.origin 
=  NSZeroPoint;
    imageBounds.size 
=  s;
    
    [anImage lockFocus];
    [self drawStringCenteredIn:imageBounds];
    [anImage unlockFocus];
    
    NSPoint p 
=  [self convertPoint:down fromView:nil];
    
    p.x 
=  p.x  -  s.width / 2 ;
    p.y 
=  p.y  -  s.height / 2 ;
    
    NSPasteboard 
* pb  =  [NSPasteboard pasteboardWithName:NSDragPboard];
    
    [self writeToPasteboard:pb];
    [self dragImage:anImage at:p offset:NSMakeSize(
0 0 event :mouseDownEvent pasteboard:pb source:self slideBack:YES];
    [anImage release];
}

-  ( void )draggedImage:(NSImage  * )image beganAt:(NSPoint)screenPoint operation:(NSDragOperation)operation
{
    
if (operation  ==  NSDragOperationDelete)
    {
        [self setString:
@"" ];
    }
}

-  ( void )writeToPasteboard:(NSPasteboard  * )pb
{
    [pb declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
    [pb setString:
string  forType:NSStringPboardType]; 
}

-  (BOOL)readFromPasteboard:(NSPasteboard  * )pb
{
    NSArray 
* types  =  [pb types];
    
if ([types containsObject:NSStringPboardType])
    {
        NSString 
* value  =  [pb stringForType:NSStringPboardType];
        
if ([value length]  ==   1 )
        {
            [self setString:value];
            
return  YES;
        }
    }
    
    
return  NO;
}

-  (IBAction)cut:(id)sender
{
    [self copy:sender];
    [self setString:
@"" ];
}

-  (IBAction)copy:(id)sender
{
    NSPasteboard 
* pb  =  [NSPasteboard generalPasteboard];
    [self writeToPasteboard:pb];
}

-  (IBAction)paste:(id)sender
{
    NSPasteboard 
* pb  =  [NSPasteboard generalPasteboard];
    
if  ( ! [self readFromPasteboard:pb]) 
    {
        NSBeep();
    }
}

-  (IBAction)savePDF:(id)sender
{
    NSSavePanel 
* panel  =  [NSSavePanel savePanel];
    [panel setRequiredFileType:
@" pdf " ];
    [panel beginSheetForDirectory:nil file:nil modalForWindow:[self window] modalDelegate:self didEndSelector:@selector(didEnd:returnCode:contextInfo:) contextInfo:NULL];
}

-  ( void )prepareAttributes
{
    attributes 
=  [[NSMutableDictionary alloc] init];
    [attributes setObject:[NSFont fontWithName:
@" Helvetica "  size: 75 ] forKey:NSFontAttributeName];
    [attributes setObject:[NSColor redColor] forKey:NSForegroundColorAttributeName];
}

-  ( void )didEnd:(NSSavePanel     * )sheet returnCode:( int )code contextInfo:( void   * )contextInfo
{
    
if (code  !=  NSOKButton)
    {
        
return ;
    }
    
    NSRect r 
=  [self bounds];
    NSData 
* data  =  [self dataWithPDFInsideRect:r];
    NSString 
* path  =  [sheet filename];
    NSError 
* error;
    BOOL successful 
=  [data writeToFile:path options: 0  error: & error];
    
if  ( ! successful) 
    {
        NSAlert 
* =  [NSAlert alertWithError:error];
        [a runModal];
    }
}

-  (id)initWithFrame:(NSRect)frameRect
{
    
if ( ! [super initWithFrame:frameRect])
    {
        
return  nil;
    }
    
    NSLog(
@" initializing view " );
    [self prepareAttributes];
    bgColor 
=  [[NSColor yellowColor] retain];
    
string   =   @"   " ;
    [self registerForDraggedTypes: [NSArray arrayWithObject:NSStringPboardType]];
    
return  self;
}

-  ( void )dealloc
{
    [bgColor release];
    [
string  release];
    [attributes release];
    [super dealloc];
}

-  ( void )drawRect:(NSRect)dirtyRect
{
    NSRect bounds 
=  [self bounds];
    
if (highlighted)
    {
        NSGradient 
* gr;
        gr 
=  [[NSGradient alloc] initWithStartingColor:[NSColor whiteColor] endingColor:bgColor];
        [gr drawInRect:bounds relativeCenterPosition:NSZeroPoint];
        [gr release];
    }
    
else  
    {
        [bgColor 
set ];
        [NSBezierPath fillRect:bounds];
    }
    
    [self drawStringCenteredIn:bounds];
    
    
if ([[self window] firstResponder]  ==  self)
    {
        [[NSColor keyboardFocusIndicatorColor] 
set ];
        [NSBezierPath setDefaultLineWidth:
4.0 ];
        [NSBezierPath strokeRect:bounds];
    }
}

-  (BOOL)isOpaque
{
    
return  YES;
}

-  (BOOL)acceptsFirstResponder
{
    NSLog(
@" Accepting " );
    
return  YES;
}

-  (BOOL)resignFirstResponder
{
    NSLog(
@" Resigning " );
    [self setNeedsDisplay:YES];
    
return  YES;
}

-  (BOOL)becomeFirstResponder
{
    NSLog(
@" Becoming " );
    [self setNeedsDisplay:YES];
    
return  YES;
}

-  ( void )keyDown:(NSEvent  * )theEvent
{
    [self interpretKeyEvents:[NSArray arrayWithObject:theEvent]];
}

-  ( void )insertText:(NSString  * )input
{
    [self setString:input];
}

-  ( void )insertTab:(id)sender
{
    [[self window] selectKeyViewPrecedingView:self];
}

-  ( void )deleteBackward:(id)sender
{
    [self setString:
@"   " ];
}

#pragma  mark Accessors

-  ( void )setBgColor:(NSColor  * )c
{
    [c retain];
    [bgColor release];
    bgColor 
=  c;
    [self setNeedsDisplay:YES];
}

-  (NSColor  * )bgColor
{
    
return  bgColor;
}

-  ( void )drawStringCenteredIn:(NSRect)r
{
    NSSize strSize 
=  [ string  sizeWithAttributes:attributes];
    NSPoint strOrigin;
    strOrigin.x 
=  r.origin.x  +  (r.size.width  -  strSize.width) / 2 ;
    strOrigin.y 
=  r.origin.y  +  (r.size.height  -  strSize.height) / 2 ;
    [
string  drawAtPoint:strOrigin withAttributes:attributes];
}

-  ( void )setString:(NSString  * )c
{
    c 
=  [c copy];
    [
string  release];
    
string   =  c;
    NSLog(
@" The string is now %@ " string );
    [self setNeedsDisplay:YES];
}

-  (NSString  * ) string
{
    
return   string ;
}

#pragma  mark Dragging Destination

-  (NSDragOperation)draggingEntered:(id  < NSDraggingInfo > )sender
{
    NSLog(
@" draggingEntered: " );
    
if  ([sender draggingSource]  ==  self) 
    {
        
return  NSDragOperationNone;
    }
    highlighted 
=  YES;
    [self setNeedsDisplay:YES];
    
return  NSDragOperationCopy;
}

-  ( void )draggingExited:(id  < NSDraggingInfo > )sender
{
    NSLog(
@" draggingExited: " );
    highlighted 
=  NO;
    [self setNeedsDisplay:YES];
}

-  (BOOL)prepareForDragOperation:(id  < NSDraggingInfo > )sender
{
    
return  YES;
}

-  (BOOL)performDragOperation:(id  < NSDraggingInfo > )sender
{
    NSPasteboard 
* pb  =  [sender draggingPasteboard];
    
if  ( ! [self readFromPasteboard:pb]) 
    {
        NSLog(
@" Error: Could not read from draggin pasteboard " );
        
return  NO;
    }
    
return  YES;
}

-  ( void )concludeDragOperation:(id  < NSDraggingInfo > )sender
{
    NSLog(
@" concludeDragOperation " );
    highlighted 
=  NO;
    [self setNeedsDisplay:YES];
}
@end

转载于:https://www.cnblogs.com/zhtf2014/archive/2011/03/03/1969654.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的示例,展示了如何使用`react-drag-and-select`组件来实现选择多个项目的功能: ```javascript import React, { useState } from "react"; import DragAndSelect from "react-drag-and-select"; function App() { const [selectedItems, setSelectedItems] = useState([]); const handleSelection = (selectedItems) => { setSelectedItems(selectedItems); }; const items = [ { id: 1, name: "Item 1" }, { id: 2, name: "Item 2" }, { id: 3, name: "Item 3" }, { id: 4, name: "Item 4" }, { id: 5, name: "Item 5" }, ]; return ( <div> <DragAndSelect items={items} onSelection={handleSelection} render={(item, index) => ( <div key={item.id} style={{ marginBottom: 10 }}> <input type="checkbox" checked={selectedItems.includes(item.id)} onChange={() => {}} /> <span style={{ marginLeft: 10 }}>{item.name}</span> </div> )} /> </div> ); } export default App; ``` 在上面的代码中,我们首先导入了`react`和`react-drag-and-select`库。然后,我们使用`useState`钩子来定义了一个名为`selectedItems`的状态,以跟踪用户选择的项目。接着,我们定义了一个名为`handleSelection`的回调函数,用于在选择发生变化时更新`selectedItems`状态。在`handleSelection`回调函数中,我们简单地将所选项目传递给`setSelectedItems`函数,以更新状态。 接下来,我们定义了一个名为`items`的数组,其中包含了我们想要供用户选择的项目。在组件的`render`方法中,我们使用`DragAndSelect`组件来包裹我们的项目。我们将`items`数组传递给`DragAndSelect`组件的`items`属性,以告诉它哪些项目可以被选择。我们还将`handleSelection`函数传递给`DragAndSelect`组件的`onSelection`属性,以在选择发生变化时接收通知。 最后,我们定义了一个`render`函数,用于渲染每个项目。在这个函数中,我们使用一个`<div>`元素来包裹每个项目,并添加了一个复选框和项目名称。我们使用`selectedItems.includes(item.id)`来确定当前项目是否被选择。如果是,我们将复选框标记为选中状态。否则,我们将复选框标记为未选中状态。 希望这个示例能够帮助您了解如何使用`react-drag-and-select`组件来实现选择多个项目的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值