/* -*- mode: C++; tab-width: 4; c-basic-offset: 4; -*- */ /* AbiSource Application Framework * 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 #import "AbiMailMan_Controller.h" #import "AbiMailMan_DataSetController.h" #import "AbiMailMan_Toolbar.h" enum AbiMailMan_ToolbarButtonTag { AMMTag_DataSet_New = 1, AMMTag_DataSet_Open, AMMTag_DataSet_Save, AMMTag_DataSet_SaveAs, AMMTag_DataSet_Close, AMMTag_Edit_InsertRowBefore, AMMTag_Edit_InsertRowAfter, AMMTag_Edit_InsertColumnBefore, AMMTag_Edit_InsertColumnAfter, AMMTag_Document_UpdateFields, AMMTag_Document_ClearFields, AMMTag_Document_Select, AMMTag_Print_Selected, AMMTag_Print_All }; @interface AbiMailMan_ToolbarButton : NSButton { NSMenu * m_menu; AbiMailMan_Toolbar * m_toolbar; NSPoint ButtonMenuPoint[3]; } - (id)initWithFrame:(NSRect)frameRect; - (void)dealloc; - (void)setMenu:(NSMenu *)menu forToolbar:(AbiMailMan_Toolbar *)toolbar; - (void)mouseDown:(NSEvent *)theEvent; - (void)drawRect:(NSRect)aRect; @end @implementation AbiMailMan_ToolbarButton - (id)initWithFrame:(NSRect)frameRect { if (self = [super initWithFrame:frameRect]) { m_menu = 0; m_toolbar = 0; ButtonMenuPoint[0].x = frameRect.size.width - 1.0f; ButtonMenuPoint[0].y = frameRect.size.height - 6.0f; ButtonMenuPoint[1].x = frameRect.size.width - 7.0f; ButtonMenuPoint[1].y = frameRect.size.height - 6.0f; ButtonMenuPoint[2].x = frameRect.size.width - 4.0f; ButtonMenuPoint[2].y = frameRect.size.height - 1.0f; } return self; } - (void)dealloc { if (m_menu) { [m_menu release]; m_menu = 0; } [super dealloc]; } - (void)setMenu:(NSMenu *)menu forToolbar:(AbiMailMan_Toolbar *)toolbar { if (m_menu) { [m_menu release]; m_menu = 0; } if (menu) { m_menu = menu; [m_menu retain]; } m_toolbar = toolbar; } - (void)mouseDown:(NSEvent *)theEvent { if (m_menu && [self isEnabled]) { [self highlight:YES]; NSRect button_frame = [self frame]; NSPoint new_location; new_location.x = 6.0f; new_location.y = button_frame.size.height + 6.0f; new_location = [self convertPoint:new_location toView:[[self window] contentView]]; NSEvent * event = [NSEvent mouseEventWithType:[theEvent type] location:new_location modifierFlags:[theEvent modifierFlags] timestamp:[theEvent timestamp] windowNumber:[theEvent windowNumber] context:[theEvent context] eventNumber:[theEvent eventNumber] clickCount:[theEvent clickCount] pressure:[theEvent pressure]]; [NSMenu popUpContextMenu:m_menu withEvent:event forView:self]; [self highlight:NO]; } else { [super mouseDown:theEvent]; } } - (void)drawRect:(NSRect)aRect { [super drawRect:aRect]; if (m_menu) { NSBezierPath * path = [NSBezierPath bezierPath]; [path moveToPoint:ButtonMenuPoint[0]]; [path lineToPoint:ButtonMenuPoint[1]]; [path lineToPoint:ButtonMenuPoint[2]]; [path closePath]; // [[NSColor whiteColor] set]; // [path stroke]; [[NSColor blackColor] set]; [path fill]; } } @end @implementation AbiMailMan_Toolbar - (id)initWithController:(AbiMailMan_Controller *)controller withDataSet:(AbiMailMan_DataSetController *)dataset { if (self = [super init]) { m_Controller = controller; m_DataSet = dataset; m_Toolbar = [[NSToolbar alloc] initWithIdentifier:@"AbiMailMan_Toolbar"]; m_TI_DataSet = [[NSToolbarItem alloc] initWithItemIdentifier:@"AbiMailMan_Toolbar_DataSet"]; m_TI_Edit = [[NSToolbarItem alloc] initWithItemIdentifier:@"AbiMailMan_Toolbar_Edit"]; m_TI_Document = [[NSToolbarItem alloc] initWithItemIdentifier:@"AbiMailMan_Toolbar_Document"]; m_TI_Print = [[NSToolbarItem alloc] initWithItemIdentifier:@"AbiMailMan_Toolbar_Print"]; [self createButtonWithMenu:@"Data Set" forToolbarItem:m_TI_DataSet ]; [self createButtonWithMenu:@"Edit" forToolbarItem:m_TI_Edit ]; [self createButtonWithMenu:@"Document" forToolbarItem:m_TI_Document]; [self createButtonWithMenu:@"Print" forToolbarItem:m_TI_Print ]; m_Identifiers = [NSArray arrayWithObjects: @"AbiMailMan_Toolbar_DataSet", @"AbiMailMan_Toolbar_Edit", @"AbiMailMan_Toolbar_Document", @"AbiMailMan_Toolbar_Print", nil]; [m_Identifiers retain]; [m_TI_DataSet setToolTip:@"Create a new Mail Merge data set, open an existing one, or save this."]; [m_TI_Edit setToolTip:@"Insert or delete rows or columns in the Mail Merge data set."]; [m_TI_Document setToolTip:@"Update Mail Merge fields in associated AbiWord document."]; [m_TI_Print setToolTip:@"Print associated AbiWord document with Mail Merge data."]; NSString * resourcePath = [[NSBundle bundleForClass:[self class]] resourcePath]; NSImage * image_DataSet = [[NSImage alloc] initWithContentsOfFile:[resourcePath stringByAppendingString:@"/ToolBarImages/DataSet.png" ]]; NSImage * image_Edit = [[NSImage alloc] initWithContentsOfFile:[resourcePath stringByAppendingString:@"/ToolBarImages/Edit.png" ]]; NSImage * image_Document = [[NSImage alloc] initWithContentsOfFile:[resourcePath stringByAppendingString:@"/ToolBarImages/Document.png"]]; NSImage * image_Print = [[NSImage alloc] initWithContentsOfFile:[resourcePath stringByAppendingString:@"/ToolBarImages/Print.png" ]]; [m_TI_DataSet setImage:image_DataSet]; [m_TI_Edit setImage:image_Edit]; [m_TI_Document setImage:image_Document]; [m_TI_Print setImage:image_Print]; [image_DataSet release]; [image_Edit release]; [image_Document release]; [image_Print release]; [m_Toolbar setDisplayMode:NSToolbarDisplayModeIconAndLabel]; [m_Toolbar setAllowsUserCustomization:NO]; [m_Toolbar setSizeMode:NSToolbarSizeModeRegular]; [m_Toolbar setVisible:YES]; [m_Toolbar setDelegate:self]; [[m_DataSet window] setToolbar:m_Toolbar]; } return self; } - (void)dealloc { [m_Toolbar release]; [m_TI_DataSet release]; [m_TI_Edit release]; [m_TI_Document release]; [m_TI_Print release]; [m_Identifiers release]; [super dealloc]; } - (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag { NSToolbarItem * item = m_TI_DataSet; if ([itemIdentifier isEqualToString:@"AbiMailMan_Toolbar_DataSet"]) { item = m_TI_DataSet; } else if ([itemIdentifier isEqualToString:@"AbiMailMan_Toolbar_Edit"]) { item = m_TI_Edit; } else if ([itemIdentifier isEqualToString:@"AbiMailMan_Toolbar_Document"]) { item = m_TI_Document; } else if ([itemIdentifier isEqualToString:@"AbiMailMan_Toolbar_Print"]) { item = m_TI_Print; } return item; } - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar { return m_Identifiers; } - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar; { return m_Identifiers; } #if 0 - (void)toolbarDidRemoveItem:(NSNotification *)notification // optional { // } - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar // optional (10.3) { return m_Identifiers; } - (void)toolbarWillAddItem:(NSNotification *)notification // optional { // } #endif - (void)aClick:(id)sender { switch ([sender tag]) { case AMMTag_DataSet_New: [m_Controller aNewDataSet:sender]; break; case AMMTag_DataSet_Open: [m_Controller aOpenDataSet:sender]; break; case AMMTag_DataSet_Save: [m_DataSet saveDataSet:sender]; break; case AMMTag_DataSet_SaveAs: break; case AMMTag_DataSet_Close: break; case AMMTag_Edit_InsertRowBefore: break; case AMMTag_Edit_InsertRowAfter: break; case AMMTag_Edit_InsertColumnBefore: break; case AMMTag_Edit_InsertColumnAfter: break; case AMMTag_Document_UpdateFields: [m_DataSet updateDocumentFields:sender]; break; case AMMTag_Document_ClearFields: [m_DataSet updateDocumentFields:sender]; break; case AMMTag_Document_Select: [m_DataSet aSelectDocument:sender]; break; case AMMTag_Print_Selected: [m_DataSet printDocument:sender]; break; case AMMTag_Print_All: [m_DataSet printDocument:sender]; break; default: // ?? break; } } - (BOOL)validateMenuItem:(id )menuItem { BOOL bEnabled = YES; switch ([menuItem tag]) { case AMMTag_DataSet_New: case AMMTag_DataSet_Open: break; case AMMTag_DataSet_Save: bEnabled = [m_DataSet isDataSetEdited] ? ([m_DataSet isDataSetUntitled] ? NO : YES) : NO; break; case AMMTag_DataSet_SaveAs: case AMMTag_DataSet_Close: break; case AMMTag_Edit_InsertRowBefore: case AMMTag_Edit_InsertRowAfter: bEnabled = ([m_DataSet rowsSelected] == 1) ? YES : NO; break; case AMMTag_Edit_InsertColumnBefore: case AMMTag_Edit_InsertColumnAfter: bEnabled = ([m_DataSet columnsSelected] == 1) ? YES : NO; break; case AMMTag_Document_UpdateFields: bEnabled = ([m_DataSet rowsSelected] == 1) ? [m_DataSet confirmDocument] : NO; break; case AMMTag_Document_ClearFields: bEnabled = [m_DataSet confirmDocument]; break; case AMMTag_Document_Select: break; case AMMTag_Print_Selected: bEnabled = ([m_DataSet rowsSelected] > 0) ? [m_DataSet confirmDocument] : NO; break; case AMMTag_Print_All: bEnabled = [m_DataSet confirmDocument]; break; default: // ?? shouldn't happen... bEnabled = NO; break; } return bEnabled; } - (void)createButtonWithMenu:(NSString *)menuName forToolbarItem:(NSToolbarItem *)toolbarItem { AbiMailMan_ToolbarButton * button = nil; NSMenu * menu = [self createMenu:menuName]; if (menu) { NSRect frame; frame.origin.x = 0.0f; frame.origin.y = 0.0f; frame.size.width = 48.0f; // bit of a hack, this :-( frame.size.height = 32.0f; button = [[AbiMailMan_ToolbarButton alloc] initWithFrame:frame]; [button setButtonType:NSMomentaryPushInButton]; [button setImagePosition:NSImageOnly]; [button setBordered:NO]; [button setMenu:menu forToolbar:self]; [toolbarItem setView:button]; [toolbarItem setMinSize:(frame.size)]; [toolbarItem setMaxSize:(frame.size)]; [button release]; } [toolbarItem setLabel:menuName]; [toolbarItem setPaletteLabel:menuName]; } - (NSMenu *)createMenu:(NSString *)menuName { NSMenu * menu = nil; if ([menuName isEqualToString:@"Data Set"]) { menu = [[NSMenu alloc] initWithTitle:menuName]; [menu addItem:[self createMenuItem:@"New" withTag:((int) AMMTag_DataSet_New) ]]; [menu addItem:[self createMenuItem:@"Open..." withTag:((int) AMMTag_DataSet_Open) ]]; [menu addItem:[self createMenuItem:@"Save" withTag:((int) AMMTag_DataSet_Save) ]]; [menu addItem:[self createMenuItem:@"Save As..." withTag:((int) AMMTag_DataSet_SaveAs)]]; [menu addItem:[self createMenuItem:@"Close" withTag:((int) AMMTag_DataSet_Close) ]]; [menu autorelease]; } else if ([menuName isEqualToString:@"Edit"]) { menu = [[NSMenu alloc] initWithTitle:menuName]; [menu addItem:[self createMenuItem:@"Insert Row Before" withTag:((int) AMMTag_Edit_InsertRowBefore) ]]; [menu addItem:[self createMenuItem:@"Insert Row After" withTag:((int) AMMTag_Edit_InsertRowAfter) ]]; [menu addItem:[self createMenuItem:@"Insert Column Before" withTag:((int) AMMTag_Edit_InsertColumnBefore)]]; [menu addItem:[self createMenuItem:@"Insert Column After" withTag:((int) AMMTag_Edit_InsertColumnAfter) ]]; [menu autorelease]; } else if ([menuName isEqualToString:@"Document"]) { menu = [[NSMenu alloc] initWithTitle:menuName]; [menu addItem:[self createMenuItem:@"Update Fields" withTag:((int) AMMTag_Document_UpdateFields)]]; [menu addItem:[self createMenuItem:@"Clear Fields" withTag:((int) AMMTag_Document_ClearFields) ]]; [menu addItem:[self createMenuItem:@"Select Document" withTag:((int) AMMTag_Document_Select) ]]; [menu autorelease]; } else if ([menuName isEqualToString:@"Print"]) { menu = [[NSMenu alloc] initWithTitle:menuName]; [menu addItem:[self createMenuItem:@"Print Selection" withTag:((int) AMMTag_Print_Selected)]]; [menu addItem:[self createMenuItem:@"Print All" withTag:((int) AMMTag_Print_All) ]]; [menu autorelease]; } return menu; } - (NSMenuItem *)createMenuItem:(NSString *)itemName withTag:(int)tag { NSMenuItem * item = [[NSMenuItem alloc] initWithTitle:itemName action:@selector(aClick:) keyEquivalent:@""]; [item setTag:tag]; [item setTarget:self]; [item autorelease]; return item; } @end