/* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */ /* CarbonToolbar / Cocoa front-end / AbiWord Plug-in * Copyright (C) 2005 Francis James Franklin * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #import "AbiCarbonToolbar_Configuration.h" #import "AbiCarbonToolbar_EditorController.h" @implementation AbiCarbonToolbar_ProviderView - (unsigned int)draggingSourceOperationMaskForLocal:(BOOL)isLocal { return (isLocal ? NSDragOperationCopy : NSDragOperationNone); } - (BOOL)ignoreModifierKeysWhileDragging { return YES; } @end @implementation AbiCarbonToolbar_EditorController - (id)initWithAbiWord:(XAP_CocoaPlugin *)AbiWord controller:(AbiCarbonToolbar_LogController *)controller { if (self = [super initWithWindowNibName:@"ToolbarEditor"]) { m_AbiWord = AbiWord; m_Controller = controller; m_Configuration = 0; m_EditData = [[NSMutableArray alloc] initWithCapacity:16]; m_bCancelled = YES; } return self; } - (void)dealloc { if (m_Configuration) { [m_Configuration release]; m_Configuration = 0; } [super dealloc]; } - (void)windowDidLoad { NSString * config_path = 0; NSArray * providers = [m_AbiWord toolProviders]; unsigned count = [providers count]; unsigned i; for (i = 0; i < count; i++) { id provider = (id ) [providers objectAtIndex:i]; AbiCarbonToolbar_EditData * data = [[AbiCarbonToolbar_EditData alloc] initWithProvider:provider]; [m_EditData addObject:data]; [data release]; } [oProviders setDataSource:self]; [oProviders setDelegate:self]; [oProviders setVerticalMotionCanBeginDrag:YES]; m_Configuration = [[AbiCarbonToolbar_Configuration alloc] initWithAbiWord:m_AbiWord controller:m_Controller]; if (config_path = [m_Configuration configurationFile]) { [m_Configuration loadConfiguration:config_path]; } [oToolbars setDataSource:m_Configuration]; [oToolbars setDelegate:m_Configuration]; [oToolbars setVerticalMotionCanBeginDrag:YES]; [oToolbars registerForDraggedTypes:[NSArray arrayWithObject:AbiCarbonToolbar_DragType_ProviderView]]; } - (void)windowWillClose:(NSNotification *)aNotification { m_bCancelled = YES; [NSApp stopModal]; } - (int)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) item; int count = 0; if (data) { if ([data isProvider]) count = (int) [[data tools] count]; } else { count = (int) [m_EditData count]; } return count; } - (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) item; return [data isProvider]; } - (id)outlineView:(NSOutlineView *)outlineView child:(int)index ofItem:(id)item { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) item; if (data) { return [[data tools] objectAtIndex:index]; } return [m_EditData objectAtIndex:index]; } - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) item; NSString * identifier = [tableColumn identifier]; NSString * str = @""; if ([data isProvider]) str = [data name]; else str = [data description]; return str; } - (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item { // ... } - (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) item; return ([data isProvider] ? NO : YES); } - (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard { unsigned count = [items count]; unsigned i; BOOL bDrag = NO; NSMutableArray * tools = [NSMutableArray arrayWithCapacity:count]; for (i = 0; i < count; i++) { AbiCarbonToolbar_EditData * data = (AbiCarbonToolbar_EditData *) [items objectAtIndex:i]; if (![data isProvider]) { NSString * provider = [data name]; NSString * identifier = [data identifier]; [tools addObject:[NSArray arrayWithObjects:provider,identifier,nil]]; bDrag = YES; } } [pboard declareTypes:[NSArray arrayWithObject:AbiCarbonToolbar_DragType_ProviderView] owner:self]; [pboard setPropertyList:tools forType:AbiCarbonToolbar_DragType_ProviderView]; return bDrag; } - (IBAction)aNew:(id)sender { [m_Configuration addUntitledToolbar]; [oToolbars reloadData]; [oToolbars setNeedsDisplay:YES]; } - (IBAction)aRemove:(id)sender { [m_Configuration removeSelectedToolOrToolbar:oToolbars]; [oToolbars reloadData]; [oToolbars setNeedsDisplay:YES]; } - (IBAction)aCancel:(id)sender { m_bCancelled = YES; [NSApp stopModal]; } - (IBAction)aOkay:(id)sender { if (![m_Configuration saveConfiguration]) { // ... TODO: raise Alert panel? } m_bCancelled = NO; [NSApp stopModal]; } - (BOOL)editorWasCancelled { return m_bCancelled; } @end