diff options
author | Aleks Kissinger <aleks0@gmail.com> | 2017-01-11 16:33:00 +0100 |
---|---|---|
committer | Aleks Kissinger <aleks0@gmail.com> | 2017-01-11 16:33:00 +0100 |
commit | 1802977b95d29198f27535b1b731d1180c083667 (patch) | |
tree | 032c4beb7411d88d76794a25f0e3b00a3437da3e /tikzit/src/gtk | |
parent | ff79a9c213dfd75ea00ed5112d3a6e314601e064 (diff) |
made new subdir
Diffstat (limited to 'tikzit/src/gtk')
118 files changed, 0 insertions, 18422 deletions
diff --git a/tikzit/src/gtk/Application.h b/tikzit/src/gtk/Application.h deleted file mode 100644 index 1b48a79..0000000 --- a/tikzit/src/gtk/Application.h +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "InputDelegate.h" - -@class Application; -@class Configuration; -@class ContextWindow; -@class Preambles; -@class PreambleEditor; -@class PreviewWindow; -@class SettingsDialog; -@class StyleManager; -@class TikzDocument; -@class ToolBox; -@class Window; -@protocol Tool; - -extern Application* app; - -/** - * Manages the main application window - */ -@interface Application: NSObject { - // the main application configuration - Configuration *configFile; - // maintains the known (user-defined) styles - StyleManager *styleManager; - // maintains the preambles used for previews - Preambles *preambles; - // the last-accessed folders (for open and save dialogs) - NSString *lastOpenFolder; - NSString *lastSaveAsFolder; - - ToolBox *toolBox; - PreambleEditor *preambleWindow; - ContextWindow *contextWindow; - SettingsDialog *settingsDialog; - - // the open windows (array of Window*) - NSMutableArray *openWindows; - - // tools - id<Tool> activeTool; - NSArray *tools; -} - -/** - * The main application configuration file - */ -@property (readonly) Configuration *mainConfiguration; - -/** - * The app-wide style manager instance - */ -@property (readonly) StyleManager *styleManager; - -/** - * The app-wide preambles registry - */ -@property (readonly) Preambles *preambles; - -/** - * The tools - */ -@property (readonly) NSArray *tools; - -/** - * The currently-selected tool - */ -@property (assign) id<Tool> activeTool; - -/** - * The folder last actively chosen by a user for opening a file - */ -@property (copy) NSString *lastOpenFolder; - -/** - * The folder last actively chosen by a user for saving a file - */ -@property (copy) NSString *lastSaveAsFolder; - -/** - * The application instance. - */ -+ (Application*) app; - -/** - * Starts the application with a single window containing an empty file - */ -- (id) init; -/** - * Starts the application with the given files open - */ -- (id) initWithFiles:(NSArray*)files; - -/** - * Loads a new, empty document in a new window - */ -- (void) newWindow; -/** - * Loads an existing document from a file in a new window - * - * @param doc the document the new window should show - */ -- (void) newWindowWithDocument:(TikzDocument*)doc; -/** - * Quit the application, confirming with the user if there are - * changes to any open documents. - */ -- (void) quit; - -/** - * Show the dialog for editing preambles. - */ -- (void) presentPreamblesEditor; -/** - * Show the context-aware window - */ -- (void) presentContextWindow; -/** - * Show the settings dialog. - */ -- (void) presentSettingsDialog; - -/** - * Save the application configuration to permanent storage - * - * Should be called just before the application exits - */ -- (void) saveConfiguration; - -/** - * @result YES if key event was processed, NO otherwise - */ -- (BOOL) activateToolForKey:(unsigned int)keyVal withMask:(InputMask)mask; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Application.m b/tikzit/src/gtk/Application.m deleted file mode 100644 index e9935bd..0000000 --- a/tikzit/src/gtk/Application.m +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Application.h" - -#import "Configuration.h" -#import "EdgeStylesModel.h" -#import "NodeStylesModel.h" -#import "PreambleEditor.h" -#import "ContextWindow.h" -#import "Shape.h" -#import "SettingsDialog.h" -#import "StyleManager.h" -#import "StyleManager+Storage.h" -#import "SupportDir.h" -#import "TikzDocument.h" -#import "ToolBox.h" -#import "Window.h" - -#ifdef HAVE_POPPLER -#import "Preambles.h" -#import "Preambles+Storage.h" -#endif - -#import "BoundingBoxTool.h" -#import "CreateNodeTool.h" -#import "CreateEdgeTool.h" -#import "HandTool.h" -#import "SelectTool.h" - -// used for args to g_mkdir_with_parents -#import "stat.h" - -Application* app = nil; - -@interface Application (Notifications) -- (void) windowClosed:(NSNotification*)notification; -- (void) windowGainedFocus:(NSNotification*)notification; -- (void) selectedToolChanged:(NSNotification*)notification; -- (void) windowDocumentChanged:(NSNotification*)n; -@end - -@interface Application (Private) -- (void) setActiveWindow:(Window*)window; -@end - -@implementation Application - -@synthesize mainConfiguration=configFile; -@synthesize styleManager, preambles; -@synthesize lastOpenFolder, lastSaveAsFolder; -@synthesize tools; - -+ (Application*) app { - if (app == nil) { - [[[self alloc] init] release]; - } - return app; -} - -- (id) _initCommon { - if (app != nil) { - [self release]; - self = app; - return self; - } - self = [super init]; - - if (self) { - NSError *error = nil; - configFile = [[Configuration alloc] initWithName:@"tikzit" loadError:&error]; - if (error != nil) { - logError (error, @"WARNING: Failed to load configuration"); - } - - styleManager = [[StyleManager alloc] init]; - [styleManager loadStylesUsingConfigurationName:@"styles"]; // FIXME: error message? - NodeStylesModel *nsm = [NodeStylesModel modelWithStyleManager:styleManager]; - EdgeStylesModel *esm = [EdgeStylesModel modelWithStyleManager:styleManager]; - -#ifdef HAVE_POPPLER - NSString *preamblesDir = [[SupportDir userSupportDir] stringByAppendingPathComponent:@"preambles"]; - preambles = [[Preambles alloc] initFromDirectory:preamblesDir]; // FIXME: error message? - [preambles setStyleManager:styleManager]; - NSString *selectedPreamble = [configFile stringEntry:@"selectedPreamble" inGroup:@"Preambles"]; - if (selectedPreamble != nil) { - [preambles setSelectedPreambleName:selectedPreamble]; - } -#endif - - lastOpenFolder = [[configFile stringEntry:@"lastOpenFolder" inGroup:@"Paths"] retain]; - if (lastOpenFolder == nil) - lastOpenFolder = [[configFile stringEntry:@"lastFolder" inGroup:@"Paths"] retain]; - lastSaveAsFolder = [[configFile stringEntry:@"lastSaveAsFolder" inGroup:@"Paths"] retain]; - if (lastSaveAsFolder == nil) - lastSaveAsFolder = [[configFile stringEntry:@"lastFolder" inGroup:@"Paths"] retain]; - - openWindows = [[NSMutableArray alloc] init]; - - tools = [[NSArray alloc] initWithObjects: - [SelectTool tool], - [CreateNodeTool toolWithNodeStylesModel:nsm], - [CreateEdgeTool toolWithEdgeStylesModel:esm], - [BoundingBoxTool tool], - [HandTool tool], - nil]; - activeTool = [tools objectAtIndex:0]; - for (id<Tool> tool in tools) { - [tool loadConfiguration:configFile]; - } - - toolBox = [[ToolBox alloc] initWithTools:tools]; - [toolBox loadConfiguration:configFile]; - [toolBox setSelectedTool:activeTool]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(selectedToolChanged:) - name:@"ToolSelectionChanged" - object:toolBox]; - [toolBox show]; - - contextWindow = [[ContextWindow alloc] initWithNodeStylesModel:nsm - andEdgeStylesModel:esm]; - [contextWindow loadConfiguration:configFile]; - - app = [self retain]; - } - - return self; -} - -- (id) init { - self = [self _initCommon]; - - if (self) { - [self newWindow]; - } - - return self; -} - -- (id) initWithFiles:(NSArray*)files { - self = [self _initCommon]; - - if (self) { - int fileOpenCount = 0; - for (NSString *file in files) { - NSError *error = nil; - TikzDocument *doc = [TikzDocument documentFromFile:file styleManager:styleManager error:&error]; - if (doc != nil) { - [self newWindowWithDocument:doc]; - ++fileOpenCount; - } else { - logError(error, @"WARNING: failed to open file"); - } - } - if (fileOpenCount == 0) { - [self newWindow]; - } - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [configFile release]; - [styleManager release]; - [preambles release]; - [lastOpenFolder release]; - [lastSaveAsFolder release]; - [preambleWindow release]; - [settingsDialog release]; - [openWindows release]; - [tools release]; - [activeTool release]; - [toolBox release]; - [contextWindow release]; - - [super dealloc]; -} - -- (id<Tool>) activeTool { return activeTool; } -- (void) setActiveTool:(id<Tool>)tool { - if (activeTool == tool) - return; - - activeTool = tool; - [toolBox setSelectedTool:tool]; - for (Window* window in openWindows) { - [window setActiveTool:tool]; - } -} - -- (BOOL) activateToolForKey:(unsigned int)keyVal withMask:(InputMask)mask { - // FIXME: cache the accel info, rather than reparsing it every time? - for (id<Tool> tool in tools) { - guint toolKey = 0; - GdkModifierType toolMod = 0; - gtk_accelerator_parse ([[tool shortcut] UTF8String], &toolKey, &toolMod); - if (toolKey != 0 && toolKey == keyVal && (int)mask == (int)toolMod) { - [self setActiveTool:tool]; - return YES; - } - } - return NO; -} - -- (void) _addWindow:(Window*)window { - [window setActiveTool:activeTool]; - [openWindows addObject:window]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(windowClosed:) - name:@"WindowClosed" - object:window]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(windowGainedFocus:) - name:@"WindowGainedFocus" - object:window]; - if ([window hasFocus]) { - [self setActiveWindow:window]; - } -} - -- (void) newWindow { - [self _addWindow:[Window window]]; -} - -- (void) newWindowWithDocument:(TikzDocument*)doc { - [self _addWindow:[Window windowWithDocument:doc]]; -} - -- (void) quit { - NSMutableArray *unsavedDocs = [NSMutableArray arrayWithCapacity:[openWindows count]]; - for (Window *window in openWindows) { - TikzDocument *doc = [window document]; - if ([doc hasUnsavedChanges]) { - [unsavedDocs addObject:doc]; - } - } - if ([unsavedDocs count] > 0) { - // FIXME: show a dialog - return; - } - gtk_main_quit(); -} - -- (void) presentPreamblesEditor { -#ifdef HAVE_POPPLER - if (preambleWindow == nil) { - preambleWindow = [[PreambleEditor alloc] initWithPreambles:preambles]; - //[preambleWindow setParentWindow:mainWindow]; - } - [preambleWindow present]; -#endif -} - -- (void) presentContextWindow { - [contextWindow present]; -} - -- (void) presentSettingsDialog { - if (settingsDialog == nil) { - settingsDialog = [[SettingsDialog alloc] initWithConfiguration:configFile - andStyleManager:styleManager]; - //[settingsDialog setParentWindow:mainWindow]; - } - [settingsDialog present]; -} - -- (Configuration*) mainConfiguration { - return configFile; -} - -- (void) saveConfiguration { - NSError *error = nil; - -#ifdef HAVE_POPPLER - if (preambles != nil) { - NSString *preamblesDir = [[SupportDir userSupportDir] stringByAppendingPathComponent:@"preambles"]; - // NSFileManager is slightly dodgy on Windows - g_mkdir_with_parents ([preamblesDir UTF8String], S_IRUSR | S_IWUSR | S_IXUSR); - [preambles storeToDirectory:preamblesDir]; - [configFile setStringEntry:@"selectedPreamble" inGroup:@"Preambles" value:[preambles selectedPreambleName]]; - } -#endif - - [styleManager saveStylesUsingConfigurationName:@"styles"]; - - for (id<Tool> tool in tools) { - [tool saveConfiguration:configFile]; - } - [toolBox saveConfiguration:configFile]; - - [contextWindow saveConfiguration:configFile]; - - if (lastOpenFolder != nil) { - [configFile setStringEntry:@"lastOpenFolder" inGroup:@"Paths" value:lastOpenFolder]; - } - if (lastSaveAsFolder != nil) { - [configFile setStringEntry:@"lastSaveAsFolder" inGroup:@"Paths" value:lastSaveAsFolder]; - } - - if (![configFile writeToStoreWithError:&error]) { - logError (error, @"Could not write config file"); - } -} - -@end - -@implementation Application (Notifications) -- (void) windowClosed:(NSNotification*)notification { - Window *window = [notification object]; - [openWindows removeObjectIdenticalTo:window]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:nil - object:window]; - if ([openWindows count] == 0) { - gtk_main_quit(); - } else { - [self setActiveWindow:[openWindows objectAtIndex:0]]; - } -} - -- (void) windowGainedFocus:(NSNotification*)notification { - Window *window = [notification object]; - [self setActiveWindow:window]; -} - -- (void) selectedToolChanged:(NSNotification*)n { - id<Tool> tool = [[n userInfo] objectForKey:@"tool"]; - if (tool != nil) - [self setActiveTool:tool]; - else - NSLog(@"nil tool!"); -} - -- (void) windowDocumentChanged:(NSNotification*)n { - [contextWindow setDocument:[[n userInfo] objectForKey:@"document"]]; -} -@end - -@implementation Application (Private) -- (void) setActiveWindow:(Window*)window { - [[NSNotificationCenter defaultCenter] removeObserver:self - name:@"DocumentChanged" - object:nil]; - - [contextWindow setDocument:[window document]]; - - [contextWindow attachToWindow:window]; - [toolBox attachToWindow:window]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(windowDocumentChanged:) - name:@"DocumentChanged" - object:window]; -} -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/BoundingBoxTool.h b/tikzit/src/gtk/BoundingBoxTool.h deleted file mode 100644 index f6498b0..0000000 --- a/tikzit/src/gtk/BoundingBoxTool.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Tool.h" - -typedef enum { - NoHandle, - EastHandle, - SouthEastHandle, - SouthHandle, - SouthWestHandle, - WestHandle, - NorthWestHandle, - NorthHandle, - NorthEastHandle -} ResizeHandle; - -@interface BoundingBoxTool : NSObject <Tool> { - GraphRenderer *renderer; - NSPoint dragOrigin; - ResizeHandle currentResizeHandle; - BOOL drawingNewBox; -} - -+ (id) tool; -- (id) init; -@end - - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/BoundingBoxTool.m b/tikzit/src/gtk/BoundingBoxTool.m deleted file mode 100644 index 483705e..0000000 --- a/tikzit/src/gtk/BoundingBoxTool.m +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "BoundingBoxTool.h" - -#import "GraphRenderer.h" -#import "TikzDocument.h" -#import "tzstockitems.h" - -static const float handle_size = 8.0; -float sideHandleTop(NSRect bbox) { - return (NSMinY(bbox) + NSMaxY(bbox) - handle_size)/2.0f; -} -float tbHandleLeft(NSRect bbox) { - return (NSMinX(bbox) + NSMaxX(bbox) - handle_size)/2.0f; -} - -@interface BoundingBoxTool (Private) -- (NSRect) screenBoundingBox; -- (ResizeHandle) boundingBoxResizeHandleAt:(NSPoint)p; -- (NSRect) boundingBoxResizeHandleRect:(ResizeHandle)handle; -- (void) setResizeCursorForHandle:(ResizeHandle)handle; -@end - -@implementation BoundingBoxTool -- (NSString*) name { return @"Bounding Box"; } -- (const gchar*) stockId { return TIKZIT_STOCK_BOUNDING_BOX; } -- (NSString*) helpText { return @"Set the bounding box"; } -- (NSString*) shortcut { return @"b"; } - -+ (id) tool { - return [[[self alloc] init] autorelease]; -} - -- (id) init { - self = [super init]; - - if (self) { - currentResizeHandle = NoHandle; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [renderer release]; - - [super dealloc]; -} - -- (GraphRenderer*) activeRenderer { return renderer; } -- (void) setActiveRenderer:(GraphRenderer*)r { - if (r == renderer) - return; - - [[renderer surface] setCursor:NormalCursor]; - - [r retain]; - [renderer release]; - renderer = r; -} - -- (GtkWidget*) configurationWidget { return NULL; } - -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - dragOrigin = pos; - currentResizeHandle = [self boundingBoxResizeHandleAt:pos]; - [[renderer document] startChangeBoundingBox]; - if (currentResizeHandle == NoHandle) { - drawingNewBox = YES; - [[[renderer document] graph] setBoundingBox:NSZeroRect]; - } else { - drawingNewBox = NO; - } - [renderer invalidateGraph]; -} - -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { - if (!(buttons & LeftButton)) { - ResizeHandle handle = [self boundingBoxResizeHandleAt:pos]; - [self setResizeCursorForHandle:handle]; - return; - } - - Transformer *transformer = [renderer transformer]; - Grid *grid = [renderer grid]; - Graph *graph = [[renderer document] graph]; - - if (currentResizeHandle == NoHandle) { - NSRect bbox = NSRectAroundPoints( - [grid snapScreenPoint:dragOrigin], - [grid snapScreenPoint:pos] - ); - [graph setBoundingBox:[transformer rectFromScreen:bbox]]; - } else { - NSRect bbox = [transformer rectToScreen:[graph boundingBox]]; - NSPoint p2 = [grid snapScreenPoint:pos]; - - if (currentResizeHandle == NorthWestHandle || - currentResizeHandle == NorthHandle || - currentResizeHandle == NorthEastHandle) { - - float dy = p2.y - NSMinY(bbox); - if (dy < bbox.size.height) { - bbox.origin.y += dy; - bbox.size.height -= dy; - } else { - bbox.origin.y = NSMaxY(bbox); - bbox.size.height = 0; - } - - } else if (currentResizeHandle == SouthWestHandle || - currentResizeHandle == SouthHandle || - currentResizeHandle == SouthEastHandle) { - - float dy = p2.y - NSMaxY(bbox); - if (-dy < bbox.size.height) { - bbox.size.height += dy; - } else { - bbox.size.height = 0; - } - } - - if (currentResizeHandle == NorthWestHandle || - currentResizeHandle == WestHandle || - currentResizeHandle == SouthWestHandle) { - - float dx = p2.x - NSMinX(bbox); - if (dx < bbox.size.width) { - bbox.origin.x += dx; - bbox.size.width -= dx; - } else { - bbox.origin.x = NSMaxX(bbox); - bbox.size.width = 0; - } - - } else if (currentResizeHandle == NorthEastHandle || - currentResizeHandle == EastHandle || - currentResizeHandle == SouthEastHandle) { - - float dx = p2.x - NSMaxX(bbox); - if (-dx < bbox.size.width) { - bbox.size.width += dx; - } else { - bbox.size.width = 0; - } - } - [graph setBoundingBox:[transformer rectFromScreen:bbox]]; - } - [[renderer document] changeBoundingBoxCheckPoint]; - [renderer invalidateGraph]; -} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - [[renderer document] endChangeBoundingBox]; - drawingNewBox = NO; - [renderer invalidateGraph]; -} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface { - if (!drawingNewBox && [[[renderer document] graph] hasBoundingBox]) { - [context saveState]; - - [context setAntialiasMode:AntialiasDisabled]; - [context setLineWidth:1.0]; - - [context startPath]; - [context rect:[self boundingBoxResizeHandleRect:EastHandle]]; - [context rect:[self boundingBoxResizeHandleRect:SouthEastHandle]]; - [context rect:[self boundingBoxResizeHandleRect:SouthHandle]]; - [context rect:[self boundingBoxResizeHandleRect:SouthWestHandle]]; - [context rect:[self boundingBoxResizeHandleRect:WestHandle]]; - [context rect:[self boundingBoxResizeHandleRect:NorthWestHandle]]; - [context rect:[self boundingBoxResizeHandleRect:NorthHandle]]; - [context rect:[self boundingBoxResizeHandleRect:NorthEastHandle]]; - [context strokePathWithColor:MakeSolidRColor (0.5, 0.5, 0.5)]; - - [context restoreState]; - } -} -- (void) loadConfiguration:(Configuration*)config {} -- (void) saveConfiguration:(Configuration*)config {} -@end - -@implementation BoundingBoxTool (Private) -- (NSRect) screenBoundingBox { - Transformer *transformer = [[renderer surface] transformer]; - Graph *graph = [[renderer document] graph]; - return [transformer rectToScreen:[graph boundingBox]]; -} - -- (ResizeHandle) boundingBoxResizeHandleAt:(NSPoint)p { - NSRect bbox = [self screenBoundingBox]; - if (p.x >= NSMaxX(bbox)) { - if (p.x <= NSMaxX(bbox) + handle_size) { - if (p.y >= NSMaxY(bbox)) { - if (p.y <= NSMaxY(bbox) + handle_size) { - return SouthEastHandle; - } - } else if (p.y <= NSMinY(bbox)) { - if (p.y >= NSMinY(bbox) - handle_size) { - return NorthEastHandle; - } - } else { - float eastHandleTop = sideHandleTop(bbox); - if (p.y >= eastHandleTop && p.y <= (eastHandleTop + handle_size)) { - return EastHandle; - } - } - } - } else if (p.x <= NSMinX(bbox)) { - if (p.x >= NSMinX(bbox) - handle_size) { - if (p.y >= NSMaxY(bbox)) { - if (p.y <= NSMaxY(bbox) + handle_size) { - return SouthWestHandle; - } - } else if (p.y <= NSMinY(bbox)) { - if (p.y >= NSMinY(bbox) - handle_size) { - return NorthWestHandle; - } - } else { - float westHandleTop = sideHandleTop(bbox); - if (p.y >= westHandleTop && p.y <= (westHandleTop + handle_size)) { - return WestHandle; - } - } - } - } else if (p.y >= NSMaxY(bbox)) { - if (p.y <= NSMaxY(bbox) + handle_size) { - float southHandleLeft = tbHandleLeft(bbox); - if (p.x >= southHandleLeft && p.x <= (southHandleLeft + handle_size)) { - return SouthHandle; - } - } - } else if (p.y <= NSMinY(bbox)) { - if (p.y >= NSMinY(bbox) - handle_size) { - float northHandleLeft = tbHandleLeft(bbox); - if (p.x >= northHandleLeft && p.x <= (northHandleLeft + handle_size)) { - return NorthHandle; - } - } - } - return NoHandle; -} - -- (NSRect) boundingBoxResizeHandleRect:(ResizeHandle)handle { - Graph *graph = [[renderer document] graph]; - if (![graph hasBoundingBox]) { - return NSZeroRect; - } - NSRect bbox = [self screenBoundingBox]; - float x; - float y; - switch (handle) { - case NorthEastHandle: - case EastHandle: - case SouthEastHandle: - x = NSMaxX(bbox); - break; - case NorthWestHandle: - case WestHandle: - case SouthWestHandle: - x = NSMinX(bbox) - handle_size; - break; - case SouthHandle: - case NorthHandle: - x = tbHandleLeft(bbox); - break; - default: - return NSZeroRect; - } - switch (handle) { - case EastHandle: - case WestHandle: - y = sideHandleTop(bbox); - break; - case SouthEastHandle: - case SouthHandle: - case SouthWestHandle: - y = NSMaxY(bbox); - break; - case NorthEastHandle: - case NorthHandle: - case NorthWestHandle: - y = NSMinY(bbox) - handle_size; - break; - default: - return NSZeroRect; - } - return NSMakeRect(x, y, handle_size, handle_size); -} - -- (void) setResizeCursorForHandle:(ResizeHandle)handle { - if (handle != currentResizeHandle) { - currentResizeHandle = handle; - Cursor c = NormalCursor; - switch (handle) { - case EastHandle: - c = ResizeRightCursor; - break; - case SouthEastHandle: - c = ResizeBottomRightCursor; - break; - case SouthHandle: - c = ResizeBottomCursor; - break; - case SouthWestHandle: - c = ResizeBottomLeftCursor; - break; - case WestHandle: - c = ResizeLeftCursor; - break; - case NorthWestHandle: - c = ResizeTopLeftCursor; - break; - case NorthHandle: - c = ResizeTopCursor; - break; - case NorthEastHandle: - c = ResizeTopRightCursor; - break; - default: - c = NormalCursor; - break; - } - [[renderer surface] setCursor:c]; - } -} -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/CairoRenderContext.h b/tikzit/src/gtk/CairoRenderContext.h deleted file mode 100644 index ac9c5ee..0000000 --- a/tikzit/src/gtk/CairoRenderContext.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "RenderContext.h" -#import "Transformer.h" -#import <cairo/cairo.h> -#import <pango/pango.h> -#import <gtk/gtk.h> - -@interface PangoTextLayout: NSObject<TextLayout> { - PangoLayout *layout; - cairo_t *context; -} - -+ (PangoTextLayout*) layoutForContext:(cairo_t*)cr withFontSize:(CGFloat)fontSize; -- (id) initWithContext:(cairo_t*)cr fontSize:(CGFloat)fontSize; -- (void) setText:(NSString*)text; - -@end - -@interface CairoRenderContext: NSObject<RenderContext> { - cairo_t *context; -} - -+ (CairoRenderContext*) contextForSurface:(cairo_surface_t*)surface; -- (id) initForSurface:(cairo_surface_t*)surface; - -+ (CairoRenderContext*) contextForWidget:(GtkWidget*)widget; -- (id) initForWidget:(GtkWidget*)widget; - -+ (CairoRenderContext*) contextForDrawable:(GdkDrawable*)d; -- (id) initForDrawable:(GdkDrawable*)d; - -+ (CairoRenderContext*) contextForPixbuf:(GdkPixbuf*)buf; -- (id) initForPixbuf:(GdkPixbuf*)buf; - -- (cairo_t*) cairoContext; -- (void) applyTransform:(Transformer*)transformer; - -- (void) clearSurface; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/CairoRenderContext.m b/tikzit/src/gtk/CairoRenderContext.m deleted file mode 100644 index 77e10b5..0000000 --- a/tikzit/src/gtk/CairoRenderContext.m +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "CairoRenderContext.h" - -#import "cairo_helpers.h" -#import "util.h" - -#import <pango/pangocairo.h> - -@implementation PangoTextLayout - -- (id) init { - [self release]; - return nil; -} - -+ (PangoTextLayout*) layoutForContext:(cairo_t*)cr withFontSize:(CGFloat)fontSize { - return [[[self alloc] initWithContext:cr fontSize:fontSize] autorelease]; -} - -- (id) initWithContext:(cairo_t*)cr fontSize:(CGFloat)fontSize { - self = [super init]; - - if (self) { - cairo_reference (cr); - context = cr; - layout = pango_cairo_create_layout (cr); - - PangoFontDescription *font_desc = pango_font_description_new (); - pango_font_description_set_family_static (font_desc, "Sans"); - pango_font_description_set_size (font_desc, pango_units_from_double (fontSize)); - pango_layout_set_font_description (layout, font_desc); - pango_font_description_free (font_desc); - } - - return self; -} - -- (void) setText:(NSString*)text { - pango_layout_set_text (layout, [text UTF8String], -1); -} - -- (NSSize) size { - int width, height; - pango_layout_get_size (layout, &width, &height); - return NSMakeSize (pango_units_to_double (width), pango_units_to_double (height)); -} - -- (NSString*) text { - return [NSString stringWithUTF8String:pango_layout_get_text (layout)]; -} - -- (void) showTextAt:(NSPoint)topLeft withColor:(RColor)color { - cairo_save (context); - - cairo_move_to(context, topLeft.x, topLeft.y); - cairo_set_source_rcolor (context, color); - pango_cairo_show_layout (context, layout); - - cairo_restore (context); -} - -- (void) dealloc { - if (layout) - g_object_unref (G_OBJECT (layout)); - if (context) - cairo_destroy (context); - - [super dealloc]; -} - -@end - -@implementation CairoRenderContext - -- (id) init { - [self release]; - return nil; -} - -+ (CairoRenderContext*) contextForSurface:(cairo_surface_t*)surface { - return [[[self alloc] initForSurface:surface] autorelease]; -} - -- (id) initForSurface:(cairo_surface_t*)surface { - self = [super init]; - - if (self) { - context = cairo_create (surface); - } - - return self; -} - -+ (CairoRenderContext*) contextForWidget:(GtkWidget*)widget { - return [[[self alloc] initForWidget:widget] autorelease]; -} - -- (id) initForWidget:(GtkWidget*)widget { - self = [super init]; - - if (self) { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - context = gdk_cairo_create (window); - } else { - [self release]; - self = nil; - } - } - - return self; -} - -+ (CairoRenderContext*) contextForDrawable:(GdkDrawable*)d { - return [[[self alloc] initForDrawable:d] autorelease]; -} - -- (id) initForDrawable:(GdkDrawable*)d { - self = [super init]; - - if (self) { - context = gdk_cairo_create (d); - } - - return self; -} - -+ (CairoRenderContext*) contextForPixbuf:(GdkPixbuf*)pixbuf { - return [[[self alloc] initForPixbuf:pixbuf] autorelease]; -} - -- (id) initForPixbuf:(GdkPixbuf*)pixbuf { - self = [super init]; - - if (self) { - cairo_format_t format = -1; - - if (gdk_pixbuf_get_colorspace (pixbuf) != GDK_COLORSPACE_RGB) { - NSLog(@"Unsupported colorspace (must be RGB)"); - [self release]; - return nil; - } - if (gdk_pixbuf_get_bits_per_sample (pixbuf) != 8) { - NSLog(@"Unsupported bits per sample (must be 8)"); - [self release]; - return nil; - } - if (gdk_pixbuf_get_has_alpha (pixbuf)) { - if (gdk_pixbuf_get_n_channels (pixbuf) != 4) { - NSLog(@"Unsupported bits per sample (must be 4 for an image with alpha)"); - [self release]; - return nil; - } - format = CAIRO_FORMAT_ARGB32; - } else { - if (gdk_pixbuf_get_n_channels (pixbuf) != 3) { - NSLog(@"Unsupported bits per sample (must be 3 for an image without alpha)"); - [self release]; - return nil; - } - format = CAIRO_FORMAT_RGB24; - } - - cairo_surface_t *surface = cairo_image_surface_create_for_data( - gdk_pixbuf_get_pixels(pixbuf), - format, - gdk_pixbuf_get_width(pixbuf), - gdk_pixbuf_get_height(pixbuf), - gdk_pixbuf_get_rowstride(pixbuf)); - context = cairo_create (surface); - cairo_surface_destroy (surface); - } - - return self; -} - -- (cairo_t*) cairoContext { - return context; -} - -- (void) applyTransform:(Transformer*)transformer { - NSPoint origin = [transformer toScreen:NSZeroPoint]; - cairo_translate (context, origin.x, origin.y); - NSPoint scale = [transformer toScreen:NSMakePoint (1.0f, 1.0f)]; - scale.x -= origin.x; - scale.y -= origin.y; - cairo_scale (context, scale.x, scale.y); -} - -- (void) saveState { - cairo_save (context); -} - -- (void) restoreState { - cairo_restore (context); -} - -- (NSRect) clipBoundingBox { - double clipx1, clipx2, clipy1, clipy2; - cairo_clip_extents (context, &clipx1, &clipy1, &clipx2, &clipy2); - return NSMakeRect (clipx1, clipy1, clipx2-clipx1, clipy2-clipy1); -} - -- (BOOL) strokeIncludesPoint:(NSPoint)p { - return cairo_in_stroke (context, p.x, p.y); -} - -- (BOOL) fillIncludesPoint:(NSPoint)p { - return cairo_in_fill (context, p.x, p.y); -} - -- (id<TextLayout>) layoutText:(NSString*)text withSize:(CGFloat)fontSize { - PangoTextLayout *layout = [PangoTextLayout layoutForContext:context withFontSize:fontSize]; - [layout setText:text]; - return layout; -} - -- (void) setAntialiasMode:(AntialiasMode)mode { - if (mode == AntialiasDisabled) { - cairo_set_antialias (context, CAIRO_ANTIALIAS_NONE); - } else { - cairo_set_antialias (context, CAIRO_ANTIALIAS_DEFAULT); - } -} - -- (void) setLineWidth:(CGFloat)width { - cairo_set_line_width (context, width); -} - -- (void) setLineDash:(CGFloat)dashLength { - if (dashLength <= 0.0) { - cairo_set_dash (context, NULL, 0, 0); - } else { - double dashes[] = { dashLength }; - cairo_set_dash (context, dashes, 1, 0); - } -} - -// paths -- (void) startPath { - cairo_new_path (context); -} - -- (void) closeSubPath { - cairo_close_path (context); -} - -- (void) moveTo:(NSPoint)p { - cairo_move_to(context, p.x, p.y); -} - -- (void) curveTo:(NSPoint)end withCp1:(NSPoint)cp1 andCp2:(NSPoint)cp2 { - cairo_curve_to (context, cp1.x, cp1.y, cp2.x, cp2.y, end.x, end.y); -} - -- (void) lineTo:(NSPoint)end { - cairo_line_to (context, end.x, end.y); -} - -- (void) rect:(NSRect)rect { - cairo_rectangle (context, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); -} - -- (void) circleAt:(NSPoint)c withRadius:(CGFloat)r { - cairo_new_sub_path (context); - cairo_arc (context, c.x, c.y, r, 0, 2 * M_PI); -} - -- (void) strokePathWithColor:(RColor)color { - cairo_set_source_rcolor (context, color); - cairo_stroke (context); -} - -- (void) fillPathWithColor:(RColor)color { - cairo_set_source_rcolor (context, color); - cairo_fill (context); -} - -- (void) strokePathWithColor:(RColor)scolor - andFillWithColor:(RColor)fcolor { - cairo_set_source_rcolor (context, fcolor); - cairo_fill_preserve (context); - cairo_set_source_rcolor (context, scolor); - cairo_stroke (context); -} - -- (void) strokePathWithColor:(RColor)scolor - andFillWithColor:(RColor)fcolor - usingAlpha:(CGFloat)alpha { - cairo_push_group (context); - cairo_set_source_rcolor (context, fcolor); - cairo_fill_preserve (context); - cairo_set_source_rcolor (context, scolor); - cairo_stroke (context); - cairo_pop_group_to_source (context); - cairo_paint_with_alpha (context, alpha); -} - -- (void) clipToPath { - cairo_clip (context); -} - -- (void) paintWithColor:(RColor)color { - cairo_set_source_rcolor (context, color); - cairo_paint (context); -} - -- (void) clearSurface { - cairo_operator_t old_op = cairo_get_operator (context); - - cairo_set_operator (context, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (context, 0.0, 0.0, 0.0, 0.0); - cairo_paint (context); - - cairo_set_operator (context, old_op); -} - -- (void) dealloc { - if (context) { - cairo_destroy (context); - } - - [super dealloc]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ColorRGB+Gtk.h b/tikzit/src/gtk/ColorRGB+Gtk.h deleted file mode 100644 index 5cfb4d7..0000000 --- a/tikzit/src/gtk/ColorRGB+Gtk.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "ColorRGB.h" -#import <gdk/gdk.h> - -@interface ColorRGB (Gtk) - -+ (ColorRGB*) colorWithGdkColor:(GdkColor)color; -- (id) initWithGdkColor:(GdkColor)color; -- (GdkColor) gdkColor; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ColorRGB+Gtk.m b/tikzit/src/gtk/ColorRGB+Gtk.m deleted file mode 100644 index be5dd56..0000000 --- a/tikzit/src/gtk/ColorRGB+Gtk.m +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "ColorRGB+Gtk.h" - -// 257 = 65535/255 -// GdkColor values run from 0 to 65535, not from 0 to 255 -#define GDK_FACTOR 257 - -@implementation ColorRGB (Gtk) - -+ (ColorRGB*) colorWithGdkColor:(GdkColor)color { - return [ColorRGB colorWithRed:color.red/GDK_FACTOR green:color.green/GDK_FACTOR blue:color.blue/GDK_FACTOR]; -} - -- (id) initWithGdkColor:(GdkColor)color { - return [self initWithRed:color.red/GDK_FACTOR green:color.green/GDK_FACTOR blue:color.blue/GDK_FACTOR]; -} - -- (GdkColor) gdkColor { - GdkColor color; - color.pixel = 0; - color.red = GDK_FACTOR * [self red]; - color.green = GDK_FACTOR * [self green]; - color.blue = GDK_FACTOR * [self blue]; - return color; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ColorRGB+IntegerListStorage.h b/tikzit/src/gtk/ColorRGB+IntegerListStorage.h deleted file mode 100644 index 118eaee..0000000 --- a/tikzit/src/gtk/ColorRGB+IntegerListStorage.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "ColorRGB.h" - -/** - * Stores a ColorRGB as a list of short integers - */ -@interface ColorRGB (IntegerListStorage) - -+ (ColorRGB*) colorFromValueList:(NSArray*)values; -- (id) initFromValueList:(NSArray*)values; -- (NSArray*) valueList; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ColorRGB+IntegerListStorage.m b/tikzit/src/gtk/ColorRGB+IntegerListStorage.m deleted file mode 100644 index 0103a3c..0000000 --- a/tikzit/src/gtk/ColorRGB+IntegerListStorage.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "ColorRGB+IntegerListStorage.h" - -@implementation ColorRGB (IntegerListStorage) - -+ (ColorRGB*) colorFromValueList:(NSArray*)values { - if ([values count] != 3) { - return nil; - } - - unsigned short redValue = [[values objectAtIndex:0] intValue]; - unsigned short greenValue = [[values objectAtIndex:1] intValue]; - unsigned short blueValue = [[values objectAtIndex:2] intValue]; - return [ColorRGB colorWithRed:redValue green:greenValue blue:blueValue]; -} - -- (id) initFromValueList:(NSArray*)values { - if ([values count] != 3) { - [self release]; - return nil; - } - - unsigned short redValue = [[values objectAtIndex:0] intValue]; - unsigned short greenValue = [[values objectAtIndex:1] intValue]; - unsigned short blueValue = [[values objectAtIndex:2] intValue]; - - return [self initWithRed:redValue green:greenValue blue:blueValue]; -} - -- (NSArray*) valueList { - NSMutableArray *array = [NSMutableArray arrayWithCapacity:3]; - [array addObject:[NSNumber numberWithInt:[self red]]]; - [array addObject:[NSNumber numberWithInt:[self green]]]; - [array addObject:[NSNumber numberWithInt:[self blue]]]; - return array; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Configuration.h b/tikzit/src/gtk/Configuration.h deleted file mode 100644 index 6c68681..0000000 --- a/tikzit/src/gtk/Configuration.h +++ /dev/null @@ -1,447 +0,0 @@ -// -// Configuration.h -// TikZiT -// -// Copyright 2010 Alex Merry -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// - -#import "TZFoundation.h" - -/** - * Manages configuration information in a grouped key-value format. - */ -@interface Configuration : NSObject { - NSString *name; - GKeyFile *file; -} - -/** - * Check whether there is any existing configuration. - */ -+ (BOOL) configurationExistsWithName:(NSString*)name; -/** - * Create a blank configuration with the given name, without loading - * any existing configuration information. - * - * @param name the name of the configuration - */ -+ (Configuration*) emptyConfigurationWithName:(NSString*)name; -/** - * Load an existing configuration for the given name. - * - * If there was no existing configuration, or it could not be opened, - * an empty configuration will be returned. - * - * @param name the name of the configuration - */ -+ (Configuration*) configurationWithName:(NSString*)name; -/** - * Load an existing configuration for the given name. - * - * If there was no existing configuration, or it could not be opened, - * an empty configuration will be returned. - * - * @param name the name of the configuration - * @param error this will be set if the configuration exists, but could - * not be opened. - */ -+ (Configuration*) configurationWithName:(NSString*)name loadError:(NSError**)error; - -/** - * Initialise the configuration to be empty - * - * Does not attempt to load any existing configuration data. - * - * @param name the name of the configuration - */ -- (id) initEmptyWithName:(NSString*)name; -/** - * Initialise a configuration, loading it if it had previously been stored. - * - * If there was no existing configuration, or it could not be opened, - * an empty configuration will be returned. - * - * @param name the name of the configuration - */ -- (id) initWithName:(NSString*)name; -/** - * Initialise a configuration, loading it if it had previously been stored. - * - * If there was no existing configuration, or it could not be opened, - * an empty configuration will be returned. - * - * @param name the name of the configuration - * @param error this will be set if the configuration exists, but could - * not be opened. - */ -- (id) initWithName:(NSString*)name loadError:(NSError**)error; - -/** - * The name of the configuration. - * - * Configurations with different names are stored independently. - */ -- (NSString*) name; -/** - * Set the name of the configuration. - * - * This will affect the behaviour of [-writeToStore] - * - * Configurations with different names are stored independently. - */ -- (void) setName:(NSString*)name; - -/** - * Writes the configuration to the backing store. - * - * The location the configuration is written to is determined by the - * [-name] property. - * - * @result YES if the configuration was successfully written, NO otherwise - */ -- (BOOL) writeToStore; -/** - * Writes the configuration to the backing store. - * - * The location the configuration is written to is determined by the - * [-name] property. - * - * @param error this will be set if the configuration could not be written - * to the backing store - * @result YES if the configuration was successfully written, NO otherwise - */ -- (BOOL) writeToStoreWithError:(NSError**)error; - -/** - * Check whether a particular key exists within a group - * - * @param key the key to check for - * @param group the name of the group to look in - * @result YES if the key exists, NO otherwise - */ -- (BOOL) hasKey:(NSString*)key inGroup:(NSString*)group; -/** - * Check whether a particular group exists - * - * @param group the name of the group to check for - * @result YES if the group exists, NO otherwise - */ -- (BOOL) hasGroup:(NSString*)group; -/** - * List the groups in the configuration. - * - * @result a list of group names - */ -- (NSArray*) groups; - -/** - * Get the value associated with a key as a string - * - * This is only guaranteed to work if the value was stored as a string. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a string, or nil - * if no string value was associated with key - */ -- (NSString*) stringEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a string - * - * This is only guaranteed to work if the value was stored as a string. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no string value was associated with key - * @result the value associated with key as a string, or default - */ -- (NSString*) stringEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSString*)def; -/** - * Get the value associated with a key as a boolean - * - * This is only guaranteed to work if the value was stored as a boolean. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a boolean, or NO - * if no boolean value was associated with key - */ -- (BOOL) booleanEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a boolean - * - * This is only guaranteed to work if the value was stored as a boolean. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no boolean value was associated with key - * @result the value associated with key as a boolean, or def - */ -- (BOOL) booleanEntry:(NSString*)key inGroup:(NSString*)group withDefault:(BOOL)def; -/** - * Get the value associated with a key as a integer - * - * This is only guaranteed to work if the value was stored as a integer. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a integer, or 0 - * if no integer value was associated with key - */ -- (int) integerEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a integer - * - * This is only guaranteed to work if the value was stored as a integer. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no integer value was associated with key - * @result the value associated with key as a integer, or def - */ -- (int) integerEntry:(NSString*)key inGroup:(NSString*)group withDefault:(int)def; -/** - * Get the value associated with a key as a double - * - * This is only guaranteed to work if the value was stored as a double. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a double, or 0 - * if no double value was associated with key - */ -- (double) doubleEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a double - * - * This is only guaranteed to work if the value was stored as a double. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no double value was associated with key - * @result the value associated with key as a double, or def - */ -- (double) doubleEntry:(NSString*)key inGroup:(NSString*)group withDefault:(double)def; - -/** - * Get the value associated with a key as a list of strings - * - * This is only guaranteed to work if the value was stored as a - * list of strings. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a list of strings, - * or nil if no list of strings was associated with key - */ -- (NSArray*) stringListEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a list of strings - * - * This is only guaranteed to work if the value was stored as a - * list of strings. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no string list value was associated with key - * @result the value associated with key as a list of strings, or def - */ -- (NSArray*) stringListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def; -/** - * Get the value associated with a key as a list of booleans - * - * This is only guaranteed to work if the value was stored as a - * list of booleans. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a list of NSNumber - * objects, containing boolean values, or nil - */ -- (NSArray*) booleanListEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a list of booleans - * - * This is only guaranteed to work if the value was stored as a - * list of booleans. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no boolean list value was associated with key - * @result the value associated with key as a list of NSNumber - * objects, containing boolean values, or def - */ -- (NSArray*) booleanListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def; -/** - * Get the value associated with a key as a list of integers - * - * This is only guaranteed to work if the value was stored as a - * list of integers. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a list of NSNumber - * objects, containing integer values, or nil - */ -- (NSArray*) integerListEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a list of integers - * - * This is only guaranteed to work if the value was stored as a - * list of integers. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no integer list value was associated with key - * @result the value associated with key as a list of NSNumber - * objects, containing integer values, or def - */ -- (NSArray*) integerListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def; -/** - * Get the value associated with a key as a list of doubles - * - * This is only guaranteed to work if the value was stored as a - * list of doubles. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @result the value associated with key as a list of NSNumber - * objects, containing double values, or nil - */ -- (NSArray*) doubleListEntry:(NSString*)key inGroup:(NSString*)group; -/** - * Get the value associated with a key as a list of doubles - * - * This is only guaranteed to work if the value was stored as a - * list of doubles. - * - * @param key the key to fetch the data for - * @param group the name of the group to look in - * @param def the value to return if no double list value was associated with key - * @result the value associated with key as a list of NSNumber - * objects, containing double values, or def - */ -- (NSArray*) doubleListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def; - -/** - * Associate a string value with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the value with - * @param group the group to store the association in - * @param value the value to store - */ -- (void) setStringEntry:(NSString*)key inGroup:(NSString*)group value:(NSString*)value; -/** - * Associate a boolean value with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the value with - * @param group the group to store the association in - * @param value the value to store - */ -- (void) setBooleanEntry:(NSString*)key inGroup:(NSString*)group value:(BOOL)value; -/** - * Associate a integer value with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the value with - * @param group the group to store the association in - * @param value the value to store - */ -- (void) setIntegerEntry:(NSString*)key inGroup:(NSString*)group value:(int)value; -/** - * Associate a double value with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the value with - * @param group the group to store the association in - * @param value the value to store - */ -- (void) setDoubleEntry:(NSString*)key inGroup:(NSString*)group value:(double)value; - -/** - * Associate a list of string values with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the list with - * @param group the group to store the association in - * @param value the list to store, as an array of strings - */ -- (void) setStringListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -/** - * Associate a list of boolean values with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the list with - * @param group the group to store the association in - * @param value the list to store, as an array of NSNumber objects - */ -- (void) setBooleanListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -/** - * Associate a list of integer values with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the list with - * @param group the group to store the association in - * @param value the list to store, as an array of NSNumber objects - */ -- (void) setIntegerListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -/** - * Associate a list of double values with a key. - * - * Any previous value (of any type) with the same key and group will - * be overwritten. - * - * @param key the key to associate the list with - * @param group the group to store the association in - * @param value the list to store, as an array of NSNumber objects - */ -- (void) setDoubleListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; - -/** - * Remove a group from the configuration - * - * This will remove all the groups key-value associations. - */ -- (void) removeGroup:(NSString*)group; -/** - * Remove a key from the configuration - * - * @param key the key to remove - * @param group the group to remove it from - */ -- (void) removeKey:(NSString*)key inGroup:(NSString*)group; - -@end - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/Configuration.m b/tikzit/src/gtk/Configuration.m deleted file mode 100644 index 4a3ed79..0000000 --- a/tikzit/src/gtk/Configuration.m +++ /dev/null @@ -1,450 +0,0 @@ -// -// Configuration.h -// TikZiT -// -// Copyright 2010 Alex Merry -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// - -#import "Configuration.h" -#import "SupportDir.h" - -@implementation Configuration - -+ (NSString*) _pathFromName:(NSString*)name { - return [NSString stringWithFormat:@"%@/%@.conf", [SupportDir userSupportDir], name]; -} - -+ (BOOL) configurationExistsWithName:(NSString*)name { - BOOL isDir; - BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath:[self _pathFromName:name] isDirectory:&isDir]; - return exists && !isDir; -} - -+ (Configuration*) emptyConfigurationWithName:(NSString*)name - { return [[[self alloc] initEmptyWithName:name] autorelease]; } -+ (Configuration*) configurationWithName:(NSString*)name - { return [[[self alloc] initWithName:name] autorelease]; } -+ (Configuration*) configurationWithName:(NSString*)name loadError:(NSError**)error - { return [[[self alloc] initWithName:name loadError:error] autorelease]; } - -- (id) init -{ - [self release]; - return nil; -} - -- (id) initEmptyWithName:(NSString*)n -{ - self = [super init]; - if (self) { - name = [n retain]; - file = g_key_file_new (); - } - - return self; -} - -- (id) _initFromFile:(NSString*)path error:(NSError**)error -{ - self = [super init]; - if (self) { - file = g_key_file_new (); - - NSFileManager *manager = [NSFileManager defaultManager]; - if ([manager fileExistsAtPath:path]) { - gchar *filename = [path glibFilename]; - - GError *gerror = NULL; - g_key_file_load_from_file (file, - filename, - G_KEY_FILE_NONE, - &gerror); - g_free (filename); - - if (gerror) { - GErrorToNSError (gerror, error); - g_error_free (gerror); - } - } - } - - return self; -} - -- (id) initWithName:(NSString*)n { - return [self initWithName:n loadError:NULL]; -} - -- (id) initWithName:(NSString*)n loadError:(NSError**)error { - self = [self _initFromFile:[Configuration _pathFromName:n] error:error]; - - if (self) { - name = [n retain]; - } - - return self; -} - -- (BOOL) _ensureParentExists:(NSString*)path error:(NSError**)error { - NSString *directory = [path stringByDeletingLastPathComponent]; - return [[NSFileManager defaultManager] ensureDirectoryExists:directory error:error]; -} - -- (BOOL) _writeFileTo:(NSString*)path error:(NSError**)error -{ - if (![self _ensureParentExists:path error:error]) { - return NO; - } - - BOOL success = NO; - gsize length; - gchar *data = g_key_file_to_data (file, &length, NULL); // never reports an error - if (data && length) { - GError *gerror = NULL; - gchar* nativePath = [path glibFilename]; - success = g_file_set_contents (nativePath, data, length, &gerror) ? YES : NO; - g_free (data); - g_free (nativePath); - if (gerror) { - g_warning ("Failed to write file: %s\n", gerror->message); - GErrorToNSError (gerror, error); - g_error_free (gerror); - } - } else { - [[NSFileManager defaultManager] removeFileAtPath:path handler:nil]; - success = YES; - } - - return success; -} - -- (NSString*) name { - return name; -} - -- (void) setName:(NSString*)n { - [n retain]; - [name release]; - name = n; -} - -- (BOOL) writeToStore { - return [self writeToStoreWithError:NULL]; -} - -- (BOOL) writeToStoreWithError:(NSError**)error { - return [self _writeFileTo:[Configuration _pathFromName:name] error:error]; -} - -- (BOOL) hasKey:(NSString*)key inGroup:(NSString*)group -{ - gboolean result = g_key_file_has_key (file, [group UTF8String], [key UTF8String], NULL); - return result ? YES : NO; -} - -- (BOOL) hasGroup:(NSString*)group -{ - gboolean result = g_key_file_has_group (file, [group UTF8String]); - return result ? YES : NO; -} - -- (NSArray*) keys:(NSString*)group -{ - gsize length; - gchar **keys = g_key_file_get_keys (file, [group UTF8String], &length, NULL); - if (!keys) - length = 0; - - NSMutableArray *array = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [array addObject:[NSString stringWithUTF8String:keys[i]]]; - } - g_strfreev (keys); - return array; -} - -- (NSArray*) groups -{ - gsize length; - gchar **groups = g_key_file_get_groups (file, &length); - NSMutableArray *array = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [array addObject:[NSString stringWithUTF8String:groups[i]]]; - } - g_strfreev (groups); - return array; -} - -- (NSString*) stringEntry:(NSString*)key inGroup:(NSString*)group -{ - return [self stringEntry:key inGroup:group withDefault:nil]; -} - -- (NSString*) stringEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSString*)def -{ - NSString *result = def; - gchar *entry = g_key_file_get_string (file, [group UTF8String], [key UTF8String], NULL); - if (entry) { - result = [NSString stringWithUTF8String:entry]; - g_free (entry); - } - return result; -} - -- (BOOL) booleanEntry:(NSString*)key inGroup:(NSString*)group withDefault:(BOOL)def -{ - GError *error = NULL; - gboolean result = g_key_file_get_boolean (file, [group UTF8String], [key UTF8String], &error); - if (error != NULL) { - g_error_free (error); - return def; - } else { - return result ? YES : NO; - } -} - -- (BOOL) booleanEntry:(NSString*)key inGroup:(NSString*)group -{ - gboolean result = g_key_file_get_boolean (file, [group UTF8String], [key UTF8String], NULL); - return result ? YES : NO; -} - -- (int) integerEntry:(NSString*)key inGroup:(NSString*)group withDefault:(int)def -{ - GError *error = NULL; - int result = g_key_file_get_integer (file, [group UTF8String], [key UTF8String], &error); - if (error != NULL) { - g_error_free (error); - return def; - } else { - return result; - } -} - -- (int) integerEntry:(NSString*)key inGroup:(NSString*)group -{ - return g_key_file_get_integer (file, [group UTF8String], [key UTF8String], NULL); -} - -- (double) doubleEntry:(NSString*)key inGroup:(NSString*)group withDefault:(double)def -{ - GError *error = NULL; - double result = g_key_file_get_double (file, [group UTF8String], [key UTF8String], &error); - if (error != NULL) { - g_error_free (error); - return def; - } else { - return result; - } -} - -- (double) doubleEntry:(NSString*)key inGroup:(NSString*)group -{ - return g_key_file_get_double (file, [group UTF8String], [key UTF8String], NULL); -} - -- (NSArray*) stringListEntry:(NSString*)key inGroup:(NSString*)group -{ - return [self stringListEntry:key inGroup:group withDefault:nil]; -} - -- (NSArray*) stringListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def -{ - gsize length; - gchar **list = g_key_file_get_string_list (file, [group UTF8String], [key UTF8String], &length, NULL); - if (list) { - NSMutableArray *result = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [result addObject:[NSString stringWithUTF8String:list[i]]]; - } - g_strfreev (list); - return result; - } else { - return def; - } -} - -- (NSArray*) booleanListEntry:(NSString*)key inGroup:(NSString*)group -{ - return [self booleanListEntry:key inGroup:group withDefault:nil]; -} - -- (NSArray*) booleanListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def -{ - gsize length; - gboolean *list = g_key_file_get_boolean_list (file, [group UTF8String], [key UTF8String], &length, NULL); - if (list) { - NSMutableArray *result = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [result addObject:[NSNumber numberWithBool:list[i]]]; - } - g_free (list); - return result; - } else { - return def; - } -} - -- (NSArray*) integerListEntry:(NSString*)key inGroup:(NSString*)group -{ - return [self integerListEntry:key inGroup:group withDefault:nil]; -} - -- (NSArray*) integerListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def -{ - gsize length; - gint *list = g_key_file_get_integer_list (file, [group UTF8String], [key UTF8String], &length, NULL); - if (list) { - NSMutableArray *result = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [result addObject:[NSNumber numberWithInt:list[i]]]; - } - g_free (list); - return result; - } else { - return def; - } -} - -- (NSArray*) doubleListEntry:(NSString*)key inGroup:(NSString*)group -{ - return [self doubleListEntry:key inGroup:group withDefault:nil]; -} - -- (NSArray*) doubleListEntry:(NSString*)key inGroup:(NSString*)group withDefault:(NSArray*)def -{ - gsize length; - double *list = g_key_file_get_double_list (file, [group UTF8String], [key UTF8String], &length, NULL); - if (list) { - NSMutableArray *result = [NSMutableArray arrayWithCapacity:length]; - for (int i = 0; i < length; ++i) { - [result addObject:[NSNumber numberWithDouble:list[i]]]; - } - g_free (list); - return result; - } else { - return def; - } -} - -- (void) setStringEntry:(NSString*)key inGroup:(NSString*)group value:(NSString*)value -{ - if (value == nil) { - [self removeKey:key inGroup:group]; - return; - } - g_key_file_set_string (file, [group UTF8String], [key UTF8String], [value UTF8String]); -} - -- (void) setBooleanEntry:(NSString*)key inGroup:(NSString*)group value:(BOOL)value; -{ - g_key_file_set_boolean (file, [group UTF8String], [key UTF8String], value); -} - -- (void) setIntegerEntry:(NSString*)key inGroup:(NSString*)group value:(int)value; -{ - g_key_file_set_integer (file, [group UTF8String], [key UTF8String], value); -} - -- (void) setDoubleEntry:(NSString*)key inGroup:(NSString*)group value:(double)value; -{ - g_key_file_set_double (file, [group UTF8String], [key UTF8String], value); -} - - -- (void) setStringListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value -{ - if (value == nil) { - [self removeKey:key inGroup:group]; - return; - } - gsize length = [value count]; - const gchar * *list = g_new (const gchar *, length); - for (int i = 0; i < length; ++i) { - list[i] = [[value objectAtIndex:i] UTF8String]; - } - g_key_file_set_string_list (file, [group UTF8String], [key UTF8String], list, length); - g_free (list); -} - -- (void) setBooleanListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -{ - if (value == nil) { - [self removeKey:key inGroup:group]; - return; - } - gsize length = [value count]; - gboolean *list = g_new (gboolean, length); - for (int i = 0; i < length; ++i) { - list[i] = [[value objectAtIndex:i] boolValue]; - } - g_key_file_set_boolean_list (file, [group UTF8String], [key UTF8String], list, length); - g_free (list); -} - -- (void) setIntegerListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -{ - if (value == nil) { - [self removeKey:key inGroup:group]; - return; - } - gsize length = [value count]; - gint *list = g_new (gint, length); - for (int i = 0; i < length; ++i) { - list[i] = [[value objectAtIndex:i] intValue]; - } - g_key_file_set_integer_list (file, [group UTF8String], [key UTF8String], list, length); - g_free (list); -} - -- (void) setDoubleListEntry:(NSString*)key inGroup:(NSString*)group value:(NSArray*)value; -{ - if (value == nil) { - [self removeKey:key inGroup:group]; - return; - } - gsize length = [value count]; - gdouble *list = g_new (gdouble, length); - for (int i = 0; i < length; ++i) { - list[i] = [[value objectAtIndex:i] doubleValue]; - } - g_key_file_set_double_list (file, [group UTF8String], [key UTF8String], list, length); - g_free (list); -} - -- (void) removeGroup:(NSString*)group -{ - g_key_file_remove_group (file, [group UTF8String], NULL); -} - -- (void) removeKey:(NSString*)key inGroup:(NSString*)group; -{ - g_key_file_remove_key (file, [group UTF8String], [key UTF8String], NULL); -} - -- (void) dealloc -{ - [name release]; - g_key_file_free (file); - file = NULL; - [super dealloc]; -} - -@end - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/ContextWindow.h b/tikzit/src/gtk/ContextWindow.h deleted file mode 100644 index fcad9df..0000000 --- a/tikzit/src/gtk/ContextWindow.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class EdgeStylesModel; -@class NodeStylesModel; -@class PropertiesPane; -@class SelectionPane; -@class StyleManager; -@class TikzDocument; -@class Window; - -@interface ContextWindow: NSObject { - PropertiesPane *propsPane; - SelectionPane *selPane; - - GtkWidget *window; - GtkWidget *layout; -} - -@property (retain) TikzDocument *document; -@property (assign) BOOL visible; - -- (id) initWithStyleManager:(StyleManager*)mgr; -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm - andEdgeStylesModel:(EdgeStylesModel*)esm; - -- (void) present; -- (void) attachToWindow:(Window*)parent; - -- (void) loadConfiguration:(Configuration*)config; -- (void) saveConfiguration:(Configuration*)config; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/ContextWindow.m b/tikzit/src/gtk/ContextWindow.m deleted file mode 100644 index d8e9d20..0000000 --- a/tikzit/src/gtk/ContextWindow.m +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "ContextWindow.h" - -#import "Configuration.h" -#import "EdgeStylesModel.h" -#import "NodeStylesModel.h" -#import "PropertiesPane.h" -#import "SelectionPane.h" -#import "StyleManager.h" -#import "Window.h" - -#import "gtkhelpers.h" - -static gboolean props_window_delete_event_cb (GtkWidget *widget, GdkEvent *event, ContextWindow *window); - -@implementation ContextWindow - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)sm { - return [self initWithNodeStylesModel:[NodeStylesModel modelWithStyleManager:sm] - andEdgeStylesModel:[EdgeStylesModel modelWithStyleManager:sm]]; -} - -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm - andEdgeStylesModel:(EdgeStylesModel*)esm { - self = [super init]; - - if (self) { - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_object_ref_sink (window); - gtk_window_set_title (GTK_WINDOW (window), "Context"); - gtk_window_set_role (GTK_WINDOW (window), "context"); - gtk_window_set_type_hint (GTK_WINDOW (window), - GDK_WINDOW_TYPE_HINT_UTILITY); - gtk_window_set_default_size (GTK_WINDOW (window), 200, 500); - g_signal_connect (G_OBJECT (window), - "delete-event", - G_CALLBACK (props_window_delete_event_cb), - self); - - layout = gtk_vbox_new (FALSE, 3); - g_object_ref_sink (layout); - gtk_widget_show (layout); - gtk_container_set_border_width (GTK_CONTAINER (layout), 6); - - gtk_container_add (GTK_CONTAINER (window), layout); - - propsPane = [[PropertiesPane alloc] init]; - gtk_box_pack_start (GTK_BOX (layout), [propsPane gtkWidget], - TRUE, TRUE, 0); - - GtkWidget *sep = gtk_hseparator_new (); - gtk_widget_show (sep); - gtk_box_pack_start (GTK_BOX (layout), sep, - FALSE, FALSE, 0); - - selPane = [[SelectionPane alloc] initWithNodeStylesModel:nsm - andEdgeStylesModel:esm]; - gtk_box_pack_start (GTK_BOX (layout), [selPane gtkWidget], - FALSE, FALSE, 0); - - // hack to position the context window somewhere sensible - // (upper right) - gtk_window_parse_geometry (GTK_WINDOW (window), "-0+0"); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (layout); - g_object_unref (window); - - [propsPane release]; - - [super dealloc]; -} - -- (TikzDocument*) document { - return [propsPane document]; -} - -- (void) setDocument:(TikzDocument*)doc { - [propsPane setDocument:doc]; - [selPane setDocument:doc]; -} - -- (BOOL) visible { - return gtk_widget_get_visible (window); -} - -- (void) setVisible:(BOOL)visible { - gtk_widget_set_visible (window, visible); -} - -- (void) present { - gtk_window_present (GTK_WINDOW (window)); -} - -- (void) attachToWindow:(Window*)parent { - utility_window_attach (GTK_WINDOW (window), [parent gtkWindow]); -} - -- (void) loadConfiguration:(Configuration*)config { - [propsPane loadConfiguration:config]; - [selPane loadConfiguration:config]; - - if ([config hasGroup:@"ContextWindow"]) { - tz_restore_window (GTK_WINDOW (window), - [config integerEntry:@"x" inGroup:@"ContextWindow"], - [config integerEntry:@"y" inGroup:@"ContextWindow"], - [config integerEntry:@"w" inGroup:@"ContextWindow"], - [config integerEntry:@"h" inGroup:@"ContextWindow"]); - } - [self setVisible:[config booleanEntry:@"visible" - inGroup:@"ContextWindow" - withDefault:YES]]; -} - -- (void) saveConfiguration:(Configuration*)config { - gint x, y, w, h; - - gtk_window_get_position (GTK_WINDOW (window), &x, &y); - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - - [config setIntegerEntry:@"x" inGroup:@"ContextWindow" value:x]; - [config setIntegerEntry:@"y" inGroup:@"ContextWindow" value:y]; - [config setIntegerEntry:@"w" inGroup:@"ContextWindow" value:w]; - [config setIntegerEntry:@"h" inGroup:@"ContextWindow" value:h]; - [config setBooleanEntry:@"visible" - inGroup:@"ContextWindow" - value:[self visible]]; - - [propsPane saveConfiguration:config]; - [selPane saveConfiguration:config]; -} - -@end - -static gboolean props_window_delete_event_cb (GtkWidget *widget, GdkEvent *event, ContextWindow *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window setVisible:NO]; - [pool drain]; - return TRUE; -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/CreateEdgeTool.h b/tikzit/src/gtk/CreateEdgeTool.h deleted file mode 100644 index d33efce..0000000 --- a/tikzit/src/gtk/CreateEdgeTool.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Tool.h" - -@class EdgeStyle; -@class EdgeStylesModel; -@class EdgeStyleSelector; -@class Node; -@class StyleManager; - -@interface CreateEdgeTool : NSObject <Tool> { - GraphRenderer *renderer; - EdgeStyleSelector *stylePicker; - GtkWidget *configWidget; - Node *sourceNode; - NSPoint sourceNodeScreenPoint; - NSPoint halfEdgeEnd; -} - -@property (retain) EdgeStyle *activeStyle; - -+ (id) toolWithStyleManager:(StyleManager*)sm; -- (id) initWithStyleManager:(StyleManager*)sm; -+ (id) toolWithEdgeStylesModel:(EdgeStylesModel*)esm; -- (id) initWithEdgeStylesModel:(EdgeStylesModel*)esm; -@end - - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/CreateEdgeTool.m b/tikzit/src/gtk/CreateEdgeTool.m deleted file mode 100644 index f3fb2c0..0000000 --- a/tikzit/src/gtk/CreateEdgeTool.m +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "CreateEdgeTool.h" - -#import "Configuration.h" -#import "EdgeStyleSelector.h" -#import "EdgeStylesModel.h" -#import "GraphRenderer.h" -#import "TikzDocument.h" -#import "tzstockitems.h" - -static void clear_style_button_cb (GtkButton *widget, - EdgeStyleSelector *selector); - -@implementation CreateEdgeTool -- (NSString*) name { return @"Create Edge"; } -- (const gchar*) stockId { return TIKZIT_STOCK_CREATE_EDGE; } -- (NSString*) helpText { return @"Create new edges"; } -- (NSString*) shortcut { return @"e"; } -@synthesize activeRenderer=renderer; -@synthesize configurationWidget=configWidget; - -+ (id) toolWithStyleManager:(StyleManager*)sm { - return [[[self alloc] initWithStyleManager:sm] autorelease]; -} - -+ (id) toolWithEdgeStylesModel:(EdgeStylesModel*)esm { - return [[[self alloc] initWithEdgeStylesModel:esm] autorelease]; -} - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)sm { - return [self initWithEdgeStylesModel:[EdgeStylesModel modelWithStyleManager:sm]]; -} - -- (id) initWithEdgeStylesModel:(EdgeStylesModel*)esm { - self = [super init]; - - if (self) { - stylePicker = [[EdgeStyleSelector alloc] initWithModel:esm]; - - configWidget = gtk_vbox_new (FALSE, 0); - g_object_ref_sink (configWidget); - - GtkWidget *label = gtk_label_new ("Edge style:"); - gtk_widget_show (label); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (configWidget), - label, - FALSE, - FALSE, - 0); - - GtkWidget *selWindow = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (selWindow); - gtk_container_add (GTK_CONTAINER (selWindow), - [stylePicker widget]); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selWindow), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - gtk_widget_show ([stylePicker widget]); - - GtkWidget *selectorFrame = gtk_frame_new (NULL); - gtk_widget_show (selectorFrame); - gtk_box_pack_start (GTK_BOX (configWidget), - selectorFrame, - TRUE, - TRUE, - 0); - gtk_container_add (GTK_CONTAINER (selectorFrame), - selWindow); - - GtkWidget *button = gtk_button_new_with_label ("No style"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (configWidget), - button, - FALSE, - FALSE, - 0); - g_signal_connect (G_OBJECT (button), - "clicked", - G_CALLBACK (clear_style_button_cb), - stylePicker); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [renderer release]; - [stylePicker release]; - [sourceNode release]; - - g_object_unref (G_OBJECT (configWidget)); - - [super dealloc]; -} - -- (EdgeStyle*) activeStyle { - return [stylePicker selectedStyle]; -} - -- (void) setActiveStyle:(EdgeStyle*)style { - return [stylePicker setSelectedStyle:style]; -} - -- (void) invalidateHalfEdge { - NSRect invRect = NSRectAroundPoints(sourceNodeScreenPoint, halfEdgeEnd); - [renderer invalidateRect:NSInsetRect (invRect, -2.0f, -2.0f)]; -} - -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - sourceNode = [renderer anyNodeAt:pos]; - if (sourceNode != nil) { - Transformer *transformer = [[renderer surface] transformer]; - sourceNodeScreenPoint = [transformer toScreen:[sourceNode point]]; - halfEdgeEnd = pos; - [renderer setNode:sourceNode highlighted:YES]; - } -} - -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { - if (!(buttons & LeftButton)) - return; - if (sourceNode == nil) - return; - - [self invalidateHalfEdge]; - - [renderer clearHighlightedNodes]; - [renderer setNode:sourceNode highlighted:YES]; - halfEdgeEnd = pos; - Node *targ = [renderer anyNodeAt:pos]; - if (targ != nil) { - [renderer setNode:targ highlighted:YES]; - } - - [self invalidateHalfEdge]; -} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - if (sourceNode == nil) - return; - - [renderer clearHighlightedNodes]; - [self invalidateHalfEdge]; - - Node *targ = [renderer anyNodeAt:pos]; - if (targ != nil) { - Edge *edge = [Edge edgeWithSource:sourceNode andTarget:targ]; - [edge setStyle:[self activeStyle]]; - [[renderer document] addEdge:edge]; - [renderer invalidateEdge:edge]; - } - - sourceNode = nil; -} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface { - if (sourceNode == nil) { - return; - } - [context saveState]; - - [context setLineWidth:1.0]; - [context startPath]; - [context moveTo:sourceNodeScreenPoint]; - [context lineTo:halfEdgeEnd]; - [context strokePathWithColor:MakeRColor (0, 0, 0, 0.5)]; - - [context restoreState]; -} - -- (StyleManager*) styleManager { - return [[stylePicker model] styleManager]; -} - -- (void) loadConfiguration:(Configuration*)config { - NSString *styleName = [config stringEntry:@"ActiveStyle" - inGroup:@"CreateEdgeTool" - withDefault:nil]; - [self setActiveStyle:[[self styleManager] edgeStyleForName:styleName]]; -} - -- (void) saveConfiguration:(Configuration*)config { - [config setStringEntry:@"ActiveStyle" - inGroup:@"CreateEdgeTool" - value:[[self activeStyle] name]]; -} -@end - -static void clear_style_button_cb (GtkButton *widget, - EdgeStyleSelector *selector) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [selector setSelectedStyle:nil]; - [pool drain]; -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/CreateNodeTool.h b/tikzit/src/gtk/CreateNodeTool.h deleted file mode 100644 index 94d6b31..0000000 --- a/tikzit/src/gtk/CreateNodeTool.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> -#import "Tool.h" - -@class NodeStyle; -@class NodeStyleSelector; -@class NodeStylesModel; -@class StyleManager; - -@interface CreateNodeTool : NSObject <Tool> { - GraphRenderer *renderer; - NodeStyleSelector *stylePicker; - GtkWidget *configWidget; -} - -@property (retain) NodeStyle *activeStyle; - -+ (id) toolWithStyleManager:(StyleManager*)sm; -- (id) initWithStyleManager:(StyleManager*)sm; -+ (id) toolWithNodeStylesModel:(NodeStylesModel*)nsm; -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm; -@end - - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/CreateNodeTool.m b/tikzit/src/gtk/CreateNodeTool.m deleted file mode 100644 index 77b24f0..0000000 --- a/tikzit/src/gtk/CreateNodeTool.m +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "CreateNodeTool.h" - -#import "Configuration.h" -#import "GraphRenderer.h" -#import "NodeStyleSelector.h" -#import "NodeStylesModel.h" -#import "TikzDocument.h" -#import "tzstockitems.h" - -static void clear_style_button_cb (GtkButton *widget, - NodeStyleSelector *selector); - -@implementation CreateNodeTool -- (NSString*) name { return @"Create Node"; } -- (const gchar*) stockId { return TIKZIT_STOCK_CREATE_NODE; } -- (NSString*) helpText { return @"Create new nodes"; } -- (NSString*) shortcut { return @"n"; } -@synthesize activeRenderer=renderer; -@synthesize configurationWidget=configWidget; - -+ (id) toolWithStyleManager:(StyleManager*)sm { - return [[[self alloc] initWithStyleManager:sm] autorelease]; -} - -+ (id) toolWithNodeStylesModel:(NodeStylesModel*)nsm { - return [[[self alloc] initWithNodeStylesModel:nsm] autorelease]; -} - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)sm { - return [self initWithNodeStylesModel:[NodeStylesModel modelWithStyleManager:sm]]; -} - -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm { - self = [super init]; - - if (self) { - stylePicker = [[NodeStyleSelector alloc] initWithModel:nsm]; - - configWidget = gtk_vbox_new (FALSE, 0); - g_object_ref_sink (configWidget); - - GtkWidget *label = gtk_label_new ("Node style:"); - gtk_widget_show (label); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (configWidget), - label, - FALSE, - FALSE, - 0); - - GtkWidget *selWindow = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (selWindow); - gtk_container_add (GTK_CONTAINER (selWindow), - [stylePicker widget]); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selWindow), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_widget_show ([stylePicker widget]); - - GtkWidget *selectorFrame = gtk_frame_new (NULL); - gtk_widget_show (selectorFrame); - gtk_box_pack_start (GTK_BOX (configWidget), - selectorFrame, - TRUE, - TRUE, - 0); - gtk_container_add (GTK_CONTAINER (selectorFrame), - selWindow); - - GtkWidget *button = gtk_button_new_with_label ("No style"); - gtk_widget_show (button); - gtk_box_pack_start (GTK_BOX (configWidget), - button, - FALSE, - FALSE, - 0); - g_signal_connect (G_OBJECT (button), - "clicked", - G_CALLBACK (clear_style_button_cb), - stylePicker); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [renderer release]; - [stylePicker release]; - - g_object_unref (G_OBJECT (configWidget)); - - [super dealloc]; -} - -- (NodeStyle*) activeStyle { - return [stylePicker selectedStyle]; -} - -- (void) setActiveStyle:(NodeStyle*)style { - return [stylePicker setSelectedStyle:style]; -} - -// FIXME: create node on press, and drag it around? -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask {} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - Transformer *transformer = [renderer transformer]; - NSPoint nodePoint = [transformer fromScreen:[[renderer grid] snapScreenPoint:pos]]; - Node *node = [Node nodeWithPoint:nodePoint]; - [node setStyle:[self activeStyle]]; - [[renderer document] addNode:node]; -} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface {} - -- (StyleManager*) styleManager { - return [[stylePicker model] styleManager]; -} - -- (void) loadConfiguration:(Configuration*)config { - NSString *styleName = [config stringEntry:@"ActiveStyle" - inGroup:@"CreateNodeTool" - withDefault:nil]; - [self setActiveStyle:[[self styleManager] nodeStyleForName:styleName]]; -} - -- (void) saveConfiguration:(Configuration*)config { - [config setStringEntry:@"ActiveStyle" - inGroup:@"CreateNodeTool" - value:[[self activeStyle] name]]; -} -@end - -static void clear_style_button_cb (GtkButton *widget, - NodeStyleSelector *selector) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [selector setSelectedStyle:nil]; - [pool drain]; -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/DocumentContext.h b/tikzit/src/gtk/DocumentContext.h deleted file mode 100644 index e4c1065..0000000 --- a/tikzit/src/gtk/DocumentContext.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" - -@class TikzDocument; - -@interface DocumentContext { - TikzDocument *document; - GraphRenderer *renderSurface; -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Edge+Render.h b/tikzit/src/gtk/Edge+Render.h deleted file mode 100644 index e88b28a..0000000 --- a/tikzit/src/gtk/Edge+Render.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Edge.h" -#import "RenderContext.h" -#import "Surface.h" - -@interface Edge (Render) - -+ (float) controlPointRadius; -- (void) renderControlsInContext:(id<RenderContext>)context withTransformer:(Transformer*)transformer; -- (void) renderBasicEdgeInContext:(id<RenderContext>)context withTransformer:(Transformer*)t selected:(BOOL)selected; -- (void) renderToSurface:(id<Surface>)surface withContext:(id<RenderContext>)context selected:(BOOL)selected; -- (NSRect) renderedBoundsWithTransformer:(Transformer*)t whenSelected:(BOOL)selected; -- (BOOL) hitByPoint:(NSPoint)p onSurface:(id<Surface>)surface withFuzz:(float)fuzz; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Edge+Render.m b/tikzit/src/gtk/Edge+Render.m deleted file mode 100644 index 3cc2a14..0000000 --- a/tikzit/src/gtk/Edge+Render.m +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Edge+Render.h" -#import "Node+Render.h" -#import "../common/util.h" - -static const float edgeWidth = 2.0; -static const float cpRadius = 3.0; -static const float cpLineWidth = 1.0; - -@implementation Edge (Render) - -+ (float) controlPointRadius { - return cpRadius; -} - -- (float) controlDistance { - const float dx = (targ.x - src.x); - const float dy = (targ.y - src.y); - if (dx == 0 && dy == 0) { - return weight; - } else { - return NSDistanceBetweenPoints(src, targ) * weight; - } -} - -- (void) renderControlsInContext:(id<RenderContext>)context withTransformer:(Transformer*)transformer { - [context saveState]; - - [self updateControls]; - - NSPoint c_source = [transformer toScreen:src]; - NSPoint c_target = [transformer toScreen:targ]; - NSPoint c_mid = [transformer toScreen:mid]; - - const float dx = (c_target.x - c_source.x); - const float dy = (c_target.y - c_source.y); - - [context setLineWidth:cpLineWidth]; - RColor fillColor = MakeRColor (1.0, 1.0, 1.0, 0.5); - - // draw a circle at the mid point - [context startPath]; - [context circleAt:c_mid withRadius:cpRadius]; - [context strokePathWithColor:MakeSolidRColor(0, 0, 1) andFillWithColor:fillColor]; - - //[context setAntialiasMode:AntialiasDisabled]; - - // size of control circles - float c_dist = 0.0f; - if (dx == 0 && dy == 0) { - c_dist = [transformer scaleToScreen:weight]; - } else { - c_dist = NSDistanceBetweenPoints(c_source, c_target) * weight; - } - - // basic bend is blue, in-out is green - RColor controlTrackColor; - if ([self bendMode] == EdgeBendModeBasic) { - controlTrackColor = MakeRColor (0.0, 0.0, 1.0, 0.4); - } else { - controlTrackColor = MakeRColor (0.0, 0.7, 0.0, 0.4); - } - - [context startPath]; - [context circleAt:c_source withRadius:c_dist]; - if (dx != 0 || dy != 0) { - [context circleAt:c_target withRadius:c_dist]; - } - [context strokePathWithColor:controlTrackColor]; - - RColor handleColor = MakeRColor (1.0, 0.0, 1.0, 0.6); - if ([self bendMode] == EdgeBendModeBasic) { - if (bend % 45 != 0) { - handleColor = MakeRColor (0.0, 0.0, 0.1, 0.4); - } - } else if ([self bendMode] == EdgeBendModeInOut) { - if (outAngle % 45 != 0) { - handleColor = MakeRColor (0.0, 0.7, 0.0, 0.4); - } - } - - NSPoint c_cp1 = [transformer toScreen:cp1]; - [context moveTo:c_source]; - [context lineTo:c_cp1]; - [context circleAt:c_cp1 withRadius:cpRadius]; - [context strokePathWithColor:handleColor]; - - if ([self bendMode] == EdgeBendModeInOut) { - // recalculate color based on inAngle - if (inAngle % 45 == 0) { - handleColor = MakeRColor (1.0, 0.0, 1.0, 0.6); - } else { - handleColor = MakeRColor (0.0, 0.7, 0.0, 0.4); - } - } - - NSPoint c_cp2 = [transformer toScreen:cp2]; - [context moveTo:c_target]; - [context lineTo:c_cp2]; - [context circleAt:c_cp2 withRadius:cpRadius]; - [context strokePathWithColor:handleColor]; - - [context restoreState]; -} - -- (void) renderArrowStrokePathInContext:(id<RenderContext>)context withTransformer:(Transformer*)transformer color:(RColor)color { - - if ([self style] != nil) { - switch ([[self style] headStyle]) { - case AH_None: - break; - case AH_Plain: - [context startPath]; - [context moveTo:[transformer toScreen:[self leftHeadNormal]]]; - [context lineTo:[transformer toScreen:head]]; - [context lineTo:[transformer toScreen:[self rightHeadNormal]]]; - [context strokePathWithColor:color]; - break; - case AH_Latex: - [context startPath]; - [context moveTo:[transformer toScreen:[self leftHeadNormal]]]; - [context lineTo:[transformer toScreen:head]]; - [context lineTo:[transformer toScreen:[self rightHeadNormal]]]; - [context closeSubPath]; - [context strokePathWithColor:color andFillWithColor:color]; - break; - } - switch ([[self style] tailStyle]) { - case AH_None: - break; - case AH_Plain: - [context startPath]; - [context moveTo:[transformer toScreen:[self leftTailNormal]]]; - [context lineTo:[transformer toScreen:tail]]; - [context lineTo:[transformer toScreen:[self rightTailNormal]]]; - [context strokePathWithColor:color]; - break; - case AH_Latex: - [context startPath]; - [context moveTo:[transformer toScreen:[self leftTailNormal]]]; - [context lineTo:[transformer toScreen:tail]]; - [context lineTo:[transformer toScreen:[self rightTailNormal]]]; - [context closeSubPath]; - [context strokePathWithColor:color andFillWithColor:color]; - break; - } - } -} - -- (void) createStrokePathInContext:(id<RenderContext>)context withTransformer:(Transformer*)transformer { - NSPoint c_tail = [transformer toScreen:tail]; - NSPoint c_cp1 = [transformer toScreen:cp1]; - NSPoint c_cp2 = [transformer toScreen:cp2]; - NSPoint c_head = [transformer toScreen:head]; - - [context startPath]; - [context moveTo:c_tail]; - [context curveTo:c_head withCp1:c_cp1 andCp2:c_cp2]; - - if ([self style] != nil) { - // draw edge decoration - switch ([[self style] decorationStyle]) { - case ED_None: - break; - case ED_Tick: - [context moveTo:[transformer toScreen:[self leftNormal]]]; - [context lineTo:[transformer toScreen:[self rightNormal]]]; - break; - case ED_Arrow: - [context moveTo:[transformer toScreen:[self leftNormal]]]; - [context lineTo:[transformer toScreen:[self midTan]]]; - [context lineTo:[transformer toScreen:[self rightNormal]]]; - break; - } - - } -} - -- (RColor) color { - if (style) { - return [[style colorRGB] rColor]; - } else { - return BlackRColor; - } -} - -- (void) renderBasicEdgeInContext:(id<RenderContext>)context withTransformer:(Transformer*)t selected:(BOOL)selected { - [self updateControls]; - [context saveState]; - - const CGFloat lineWidth = style ? [style thickness] : edgeWidth; - [context setLineWidth:lineWidth]; - RColor color = [self color]; - if (selected) { - color.alpha = 0.5; - } - - [self createStrokePathInContext:context withTransformer:t]; - [context strokePathWithColor:color]; - - [self renderArrowStrokePathInContext:context withTransformer:t color:color]; - - [context restoreState]; -} - -- (void) renderToSurface:(id <Surface>)surface withContext:(id<RenderContext>)context selected:(BOOL)selected { - [self renderBasicEdgeInContext:context withTransformer:[surface transformer] selected:selected]; - - if (selected) { - [self renderControlsInContext:context withTransformer:[surface transformer]]; - } - - if ([self hasEdgeNode]) { - NSPoint labelPt = [[surface transformer] toScreen:[self mid]]; - [[self edgeNode] renderLabelAt:labelPt - withContext:context]; - } -} - -- (NSRect) renderedBoundsWithTransformer:(Transformer*)t whenSelected:(BOOL)selected { - if (selected) { - float c_dist = [self controlDistance] + cpRadius; // include handle - NSRect cp1circ = NSMakeRect (head.x - c_dist, head.y - c_dist, 2*c_dist, 2*c_dist); - NSRect cp2circ = NSMakeRect (tail.x - c_dist, tail.y - c_dist, 2*c_dist, 2*c_dist); - NSRect rect = NSUnionRect ([self boundingRect], NSUnionRect (cp1circ, cp2circ)); - return [t rectToScreen:rect]; - } else { - return [t rectToScreen:[self boundingRect]]; - } -} - -- (BOOL) hitByPoint:(NSPoint)p onSurface:(id<Surface>)surface withFuzz:(float)fuzz { - [self updateControls]; - - NSRect boundingRect = [[surface transformer] rectToScreen:[self boundingRect]]; - if (!NSPointInRect(p, NSInsetRect(boundingRect, -fuzz, -fuzz))) { - return NO; - } - - id<RenderContext> cr = [surface createRenderContext]; - - [cr setLineWidth:edgeWidth + 2 * fuzz]; - [self createStrokePathInContext:cr withTransformer:[surface transformer]]; - - return [cr strokeIncludesPoint:p]; -} - -@end - -// vim:ft=objc:ts=4:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStyle+Gtk.h b/tikzit/src/gtk/EdgeStyle+Gtk.h deleted file mode 100644 index 4323593..0000000 --- a/tikzit/src/gtk/EdgeStyle+Gtk.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "EdgeStyle.h" -#import <gtk/gtk.h> - -@interface EdgeStyle (Gtk) - -- (GdkColor) color; -- (void) setColor:(GdkColor)color; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStyle+Gtk.m b/tikzit/src/gtk/EdgeStyle+Gtk.m deleted file mode 100644 index 886329e..0000000 --- a/tikzit/src/gtk/EdgeStyle+Gtk.m +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStyle+Gtk.h" -#import "ColorRGB+Gtk.h" - -@implementation EdgeStyle (Gtk) - -- (GdkColor) color { - return [[self colorRGB] gdkColor]; -} - -- (void) setColor:(GdkColor)color { - [self setColorRGB:[ColorRGB colorWithGdkColor:color]]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStyle+Storage.h b/tikzit/src/gtk/EdgeStyle+Storage.h deleted file mode 100644 index 74881f3..0000000 --- a/tikzit/src/gtk/EdgeStyle+Storage.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "EdgeStyle.h" -#import "Configuration.h" - -@interface EdgeStyle (Storage) - -- (id) initFromConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile; -- (void) storeToConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStyle+Storage.m b/tikzit/src/gtk/EdgeStyle+Storage.m deleted file mode 100644 index 45e2a20..0000000 --- a/tikzit/src/gtk/EdgeStyle+Storage.m +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStyle+Storage.h" -#import "ColorRGB+IntegerListStorage.h" - -@implementation EdgeStyle (Storage) - -- (id) initFromConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile { - self = [self init]; - - if (self) { - [self setName:[configFile stringEntry:@"Name" inGroup:groupName withDefault:name]]; - [self setCategory:[configFile stringEntry:@"Category" inGroup:groupName withDefault:category]]; - headStyle = [configFile integerEntry:@"HeadStyle" inGroup:groupName withDefault:headStyle]; - tailStyle = [configFile integerEntry:@"TailStyle" inGroup:groupName withDefault:tailStyle]; - decorationStyle = [configFile integerEntry:@"DecorationStyle" inGroup:groupName withDefault:decorationStyle]; - thickness = [configFile doubleEntry:@"Thickness" inGroup:groupName withDefault:thickness]; - [self setColorRGB: - [ColorRGB colorFromValueList: - [configFile integerListEntry:@"Color" - inGroup:groupName - withDefault:[colorRGB valueList]]]]; - } - - return self; -} - -- (void) storeToConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile { - [configFile setStringEntry:@"Name" inGroup:groupName value:name]; - [configFile setStringEntry:@"Category" inGroup:groupName value:category]; - [configFile setIntegerEntry:@"HeadStyle" inGroup:groupName value:headStyle]; - [configFile setIntegerEntry:@"TailStyle" inGroup:groupName value:tailStyle]; - [configFile setIntegerEntry:@"DecorationStyle" inGroup:groupName value:decorationStyle]; - [configFile setDoubleEntry:@"Thickness" inGroup:groupName value:thickness]; - [configFile setIntegerListEntry:@"Color" inGroup:groupName value:[[self colorRGB] valueList]]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStyleEditor.h b/tikzit/src/gtk/EdgeStyleEditor.h deleted file mode 100644 index 2224bbb..0000000 --- a/tikzit/src/gtk/EdgeStyleEditor.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class EdgeStyle; - -@interface EdgeStyleEditor: NSObject { - EdgeStyle *style; - GtkTable *table; - GtkEntry *nameEdit; - GtkComboBox *decorationCombo; - GtkComboBox *headArrowCombo; - GtkComboBox *tailArrowCombo; - GtkColorButton *colorButton; - GtkWidget *makeColorTexSafeButton; - GtkAdjustment *thicknessAdj; - BOOL blockSignals; -} - -@property (retain) EdgeStyle *style; -@property (readonly) GtkWidget *widget; - -- (id) init; - -- (void) selectNameField; - -@end - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/EdgeStyleEditor.m b/tikzit/src/gtk/EdgeStyleEditor.m deleted file mode 100644 index c7ca8bd..0000000 --- a/tikzit/src/gtk/EdgeStyleEditor.m +++ /dev/null @@ -1,499 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStyleEditor.h" - -#import "EdgeStyle.h" -#import "EdgeStyle+Gtk.h" -#import "Shape.h" - -#include <gdk-pixbuf/gdk-pixdata.h> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpointer-sign" -#import "edgedecdata.m" -#pragma GCC diagnostic pop - -// {{{ Data Types -enum { - DEC_NAME_COL = 0, - DEC_PREVIEW_COL, - DEC_VALUE_COL, - DEC_N_COLS -}; - -struct dec_info { - const gchar *name; - const GdkPixdata *pixdata; - int value; -}; -static struct dec_info ed_entries[] = { - { "None", &ED_none_pixdata, ED_None }, - { "Arrow", &ED_arrow_pixdata, ED_Arrow }, - { "Tick", &ED_tick_pixdata, ED_Tick } -}; -static guint n_ed_entries = G_N_ELEMENTS (ed_entries); -static struct dec_info ah_head_entries[] = { - { "None", &AH_none_pixdata, AH_None }, - { "Plain", &AH_plain_head_pixdata, AH_Plain }, - { "Latex", &AH_latex_head_pixdata, AH_Latex } -}; -static guint n_ah_head_entries = G_N_ELEMENTS (ah_head_entries); -static struct dec_info ah_tail_entries[] = { - { "None", &AH_none_pixdata, AH_None }, - { "Plain", &AH_plain_tail_pixdata, AH_Plain }, - { "Latex", &AH_latex_tail_pixdata, AH_Latex } -}; -static guint n_ah_tail_entries = G_N_ELEMENTS (ah_tail_entries); - -static const guint row_count = 6; - -// }}} -// {{{ Internal interfaces -// {{{ GTK+ Callbacks -static void style_name_edit_changed_cb (GtkEditable *widget, EdgeStyleEditor *editor); -static void decoration_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor); -static void head_arrow_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor); -static void tail_arrow_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor); -static void thickness_adjustment_changed_cb (GtkAdjustment *widget, EdgeStyleEditor *editor); -static void color_changed_cb (GtkColorButton *widget, EdgeStyleEditor *editor); -static void make_color_safe_button_clicked_cb (GtkButton *widget, EdgeStyleEditor *editor); -// }}} -// {{{ Notifications - -@interface EdgeStyleEditor (Notifications) -- (void) nameChangedTo:(NSString*)value; -- (void) edgeDecorationChangedTo:(EdgeDectorationStyle)value; -- (void) headArrowChangedTo:(ArrowHeadStyle)value; -- (void) tailArrowChangedTo:(ArrowHeadStyle)value; -- (void) thicknessChangedTo:(double)value; -- (void) makeColorTexSafe; -- (void) colorChangedTo:(GdkColor)value; -@end - -// }}} -// {{{ Private - -@interface EdgeStyleEditor (Private) -- (void) load:(guint)count decorationStylesFrom:(struct dec_info*)info into:(GtkListStore*)list; -- (void) clearDecCombo:(GtkComboBox*)combo; -- (void) setDecCombo:(GtkComboBox*)combo toValue:(int)value; -@end - -// }}} -// }}} -// {{{ API - -@implementation EdgeStyleEditor - -- (void) _addWidget:(GtkWidget*)w withLabel:(gchar *)label atRow:(guint)row { - NSAssert(row < row_count, @"row_count is wrong!"); - - GtkWidget *l = gtk_label_new (label); - gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); - gtk_widget_show (l); - gtk_widget_show (w); - - gtk_table_attach (table, l, - 0, 1, row, row+1, // l, r, t, b - GTK_FILL, // x opts - GTK_FILL | GTK_EXPAND, // y opts - 5, // x padding - 0); // y padding - - gtk_table_attach (table, w, - 1, 2, row, row+1, // l, r, t, b - GTK_FILL | GTK_EXPAND, // x opts - GTK_FILL | GTK_EXPAND, // y opts - 0, // x padding - 0); // y padding -} - -- (GtkComboBox*) _createDecComboWithEntries:(struct dec_info*)entries count:(guint)n { - GtkListStore *store = gtk_list_store_new (DEC_N_COLS, G_TYPE_STRING, GDK_TYPE_PIXBUF, G_TYPE_INT); - [self load:n decorationStylesFrom:entries into:store]; - - GtkComboBox *combo = GTK_COMBO_BOX (gtk_combo_box_new_with_model (GTK_TREE_MODEL (store))); - g_object_unref (store); - GtkCellRenderer *cellRend = gtk_cell_renderer_pixbuf_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo), - cellRend, - TRUE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (combo), cellRend, "pixbuf", DEC_PREVIEW_COL); - g_object_ref_sink (combo); - - return combo; -} - -- (GtkWidget*) _createMakeColorTexSafeButton { - GtkWidget *b = gtk_button_new (); - GtkWidget *icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); - gtk_widget_show (icon); - gtk_container_add (GTK_CONTAINER (b), icon); - NSString *ttip = @"The colour is not a predefined TeX colour.\nClick here to choose the nearest TeX-safe colour."; - gtk_widget_set_tooltip_text (b, [ttip UTF8String]); - return b; -} - -- (id) init { - self = [super init]; - - if (self != nil) { - style = nil; - table = GTK_TABLE (gtk_table_new (row_count, 2, FALSE)); - gtk_table_set_col_spacings (table, 6); - gtk_table_set_row_spacings (table, 6); - gtk_widget_set_sensitive (GTK_WIDGET (table), FALSE); - blockSignals = NO; - - /** - * Name - */ - nameEdit = GTK_ENTRY (gtk_entry_new ()); - g_object_ref_sink (nameEdit); - [self _addWidget:GTK_WIDGET (nameEdit) - withLabel:"Name" - atRow:0]; - g_signal_connect (G_OBJECT (nameEdit), - "changed", - G_CALLBACK (style_name_edit_changed_cb), - self); - - - /** - * Edge decoration style - */ - decorationCombo = [self _createDecComboWithEntries:ed_entries count:n_ed_entries]; - [self _addWidget:GTK_WIDGET (decorationCombo) - withLabel:"Decoration" - atRow:1]; - g_signal_connect (G_OBJECT (decorationCombo), - "changed", - G_CALLBACK (decoration_combo_changed_cb), - self); - - - /** - * Head arrow style - */ - headArrowCombo = [self _createDecComboWithEntries:ah_head_entries count:n_ah_head_entries]; - [self _addWidget:GTK_WIDGET (headArrowCombo) - withLabel:"Arrow head" - atRow:2]; - g_signal_connect (G_OBJECT (headArrowCombo), - "changed", - G_CALLBACK (head_arrow_combo_changed_cb), - self); - - - /** - * Tail arrow style - */ - tailArrowCombo = [self _createDecComboWithEntries:ah_tail_entries count:n_ah_tail_entries]; - [self _addWidget:GTK_WIDGET (tailArrowCombo) - withLabel:"Arrow tail" - atRow:3]; - g_signal_connect (G_OBJECT (tailArrowCombo), - "changed", - G_CALLBACK (tail_arrow_combo_changed_cb), - self); - - - /** - * Colour - */ - GtkWidget *colorBox = gtk_hbox_new (FALSE, 0); - [self _addWidget:colorBox - withLabel:"Colour" - atRow:4]; - colorButton = GTK_COLOR_BUTTON (gtk_color_button_new ()); - g_object_ref_sink (colorButton); - gtk_widget_show (GTK_WIDGET (colorButton)); - gtk_box_pack_start (GTK_BOX (colorBox), GTK_WIDGET (colorButton), - FALSE, FALSE, 0); - makeColorTexSafeButton = [self _createMakeColorTexSafeButton]; - g_object_ref_sink (makeColorTexSafeButton); - gtk_box_pack_start (GTK_BOX (colorBox), makeColorTexSafeButton, - FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (colorButton), - "color-set", - G_CALLBACK (color_changed_cb), - self); - g_signal_connect (G_OBJECT (makeColorTexSafeButton), - "clicked", - G_CALLBACK (make_color_safe_button_clicked_cb), - self); - - - /** - * Thickness - */ - thicknessAdj = GTK_ADJUSTMENT (gtk_adjustment_new ( - 1.0, // value - 0.0, // lower - 50.0, // upper - 0.20, // step - 1.0, // page - 0.0)); // (irrelevant) - g_object_ref_sink (thicknessAdj); - GtkWidget *scaleSpin = gtk_spin_button_new (thicknessAdj, 0.0, 2); - [self _addWidget:scaleSpin - withLabel:"Thickness" - atRow:5]; - g_signal_connect (G_OBJECT (thicknessAdj), - "value-changed", - G_CALLBACK (thickness_adjustment_changed_cb), - self); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (nameEdit); - g_object_unref (decorationCombo); - g_object_unref (colorButton); - g_object_unref (makeColorTexSafeButton); - g_object_unref (thicknessAdj); - g_object_unref (table); - [style release]; - - [super dealloc]; -} - -- (EdgeStyle*) style { - return style; -} - -- (void) setStyle:(EdgeStyle*)s { - blockSignals = YES; - EdgeStyle *oldStyle = style; - style = [s retain]; - - if (style != nil) { - gtk_widget_set_sensitive (GTK_WIDGET (table), TRUE); - - gtk_entry_set_text(nameEdit, [[style name] UTF8String]); - - [self setDecCombo:decorationCombo toValue:[style decorationStyle]]; - [self setDecCombo:headArrowCombo toValue:[style headStyle]]; - [self setDecCombo:tailArrowCombo toValue:[style tailStyle]]; - - GdkColor c = [style color]; - gtk_color_button_set_color(colorButton, &c); - gtk_widget_set_visible (makeColorTexSafeButton, ([[style colorRGB] name] == nil)); - - gtk_adjustment_set_value(thicknessAdj, [style thickness]); - } else { - gtk_entry_set_text(nameEdit, ""); - [self clearDecCombo:decorationCombo]; - [self clearDecCombo:headArrowCombo]; - [self clearDecCombo:tailArrowCombo]; - gtk_widget_set_visible (makeColorTexSafeButton, FALSE); - gtk_adjustment_set_value(thicknessAdj, 1.0); - gtk_widget_set_sensitive (GTK_WIDGET (table), FALSE); - } - - [oldStyle release]; - blockSignals = NO; -} - -- (GtkWidget*) widget { - return GTK_WIDGET (table); -} - -- (void) selectNameField { - gtk_widget_grab_focus (GTK_WIDGET (nameEdit)); - gtk_editable_select_region (GTK_EDITABLE (nameEdit), 0, -1); -} - -@end - -// }}} -// {{{ Notifications - -@implementation EdgeStyleEditor (Notifications) -- (void) nameChangedTo:(NSString*)value { - [style setName:value]; -} - -- (void) edgeDecorationChangedTo:(EdgeDectorationStyle)value { - [style setDecorationStyle:value]; -} - -- (void) headArrowChangedTo:(ArrowHeadStyle)value { - [style setHeadStyle:value]; -} - -- (void) tailArrowChangedTo:(ArrowHeadStyle)value { - [style setTailStyle:value]; -} - -- (void) thicknessChangedTo:(double)value { - [style setThickness:(float)value]; -} - -- (void) colorChangedTo:(GdkColor)value { - [style setColor:value]; - gtk_widget_set_visible (makeColorTexSafeButton, - [[style colorRGB] name] == nil); -} - -- (void) makeColorTexSafe { - if (style != nil) { - [[style colorRGB] setToClosestHashed]; - GdkColor color = [style color]; - gtk_color_button_set_color(colorButton, &color); - gtk_widget_set_visible (makeColorTexSafeButton, FALSE); - } -} -@end - -// }}} -// {{{ Private - -@implementation EdgeStyleEditor (Private) -- (BOOL) signalsBlocked { return blockSignals; } - -- (void) load:(guint)count decorationStylesFrom:(struct dec_info*)info into:(GtkListStore*)list { - GtkTreeIter iter; - - for (guint i = 0; i < count; ++i) { - GdkPixbuf *buf = gdk_pixbuf_from_pixdata (info[i].pixdata, FALSE, NULL); - gtk_list_store_append (list, &iter); - gtk_list_store_set (list, &iter, - DEC_NAME_COL, info[i].name, - DEC_PREVIEW_COL, buf, - DEC_VALUE_COL, info[i].value, - -1); - g_object_unref (buf); - } -} - -- (void) clearDecCombo:(GtkComboBox*)combo { - gtk_combo_box_set_active (combo, -1); -} - -- (void) setDecCombo:(GtkComboBox*)combo toValue:(int)value { - GtkTreeModel *model = gtk_combo_box_get_model (combo); - GtkTreeIter iter; - if (gtk_tree_model_get_iter_first (model, &iter)) { - do { - int rowValue; - gtk_tree_model_get (model, &iter, DEC_VALUE_COL, &rowValue, -1); - if (rowValue == value) { - gtk_combo_box_set_active_iter (combo, &iter); - return; - } - } while (gtk_tree_model_iter_next (model, &iter)); - } -} -@end - -// }}} -// {{{ GTK+ callbacks - -static void style_name_edit_changed_cb (GtkEditable *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - const gchar *contents = gtk_entry_get_text (GTK_ENTRY (widget)); - [editor nameChangedTo:[NSString stringWithUTF8String:contents]]; - - [pool drain]; -} - -static void decoration_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GtkTreeIter iter; - gtk_combo_box_get_active_iter (widget, &iter); - EdgeDectorationStyle dec = ED_None; - gtk_tree_model_get (gtk_combo_box_get_model (widget), &iter, DEC_VALUE_COL, &dec, -1); - [editor edgeDecorationChangedTo:dec]; - - [pool drain]; -} - -static void head_arrow_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GtkTreeIter iter; - gtk_combo_box_get_active_iter (widget, &iter); - ArrowHeadStyle dec = AH_None; - gtk_tree_model_get (gtk_combo_box_get_model (widget), &iter, DEC_VALUE_COL, &dec, -1); - [editor headArrowChangedTo:dec]; - - [pool drain]; -} - -static void tail_arrow_combo_changed_cb (GtkComboBox *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GtkTreeIter iter; - gtk_combo_box_get_active_iter (widget, &iter); - ArrowHeadStyle dec = AH_None; - gtk_tree_model_get (gtk_combo_box_get_model (widget), &iter, DEC_VALUE_COL, &dec, -1); - [editor tailArrowChangedTo:dec]; - - [pool drain]; -} - -static void thickness_adjustment_changed_cb (GtkAdjustment *adj, EdgeStyleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor thicknessChangedTo:gtk_adjustment_get_value (adj)]; - [pool drain]; -} - -static void color_changed_cb (GtkColorButton *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GdkColor color; - gtk_color_button_get_color (widget, &color); - [editor colorChangedTo:color]; - - [pool drain]; -} - -static void make_color_safe_button_clicked_cb (GtkButton *widget, EdgeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor makeColorTexSafe]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/EdgeStyleSelector.h b/tikzit/src/gtk/EdgeStyleSelector.h deleted file mode 100644 index 904bd93..0000000 --- a/tikzit/src/gtk/EdgeStyleSelector.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class EdgeStyle; -@class EdgeStylesModel; -@class StyleManager; - -@interface EdgeStyleSelector: NSObject { - EdgeStylesModel *model; - GtkTreeView *view; -} - -/*! - @property widget - @brief The GTK widget - */ -@property (readonly) GtkWidget *widget; - -/*! - @property model - @brief The model to use. - */ -@property (retain) EdgeStylesModel *model; - -/*! - @property selectedStyle - @brief The selected style. - - When this changes, a SelectedStyleChanged notification will be posted - */ -@property (assign) EdgeStyle *selectedStyle; - -/*! - * Initialise with a new model for the given style manager - */ -- (id) initWithStyleManager:(StyleManager*)m; -/*! - * Initialise with the given model - */ -- (id) initWithModel:(EdgeStylesModel*)model; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/EdgeStyleSelector.m b/tikzit/src/gtk/EdgeStyleSelector.m deleted file mode 100644 index 6a9db33..0000000 --- a/tikzit/src/gtk/EdgeStyleSelector.m +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStyleSelector.h" - -#import "EdgeStylesModel.h" - -// {{{ Internal interfaces -static void selection_changed_cb (GtkTreeSelection *sel, EdgeStyleSelector *mgr); -// }}} -// {{{ API - -@implementation EdgeStyleSelector - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)m { - return [self initWithModel:[EdgeStylesModel modelWithStyleManager:m]]; -} -- (id) initWithModel:(EdgeStylesModel*)m { - self = [super init]; - - if (self) { - model = [m retain]; - - view = GTK_TREE_VIEW (gtk_tree_view_new_with_model ([m model])); - gtk_tree_view_set_headers_visible (view, FALSE); - g_object_ref (view); - - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - renderer = gtk_cell_renderer_pixbuf_new (); - column = gtk_tree_view_column_new_with_attributes ( - "Preview", - renderer, - "pixbuf", EDGE_STYLES_ICON_COL, - NULL); - gtk_tree_view_append_column (view, column); - gtk_tree_view_set_tooltip_column (view, EDGE_STYLES_NAME_COL); - - GtkTreeSelection *sel = gtk_tree_view_get_selection (view); - gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE); - - g_signal_connect (G_OBJECT (sel), - "changed", - G_CALLBACK (selection_changed_cb), - self); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (view); - [model release]; - - [super dealloc]; -} - -- (EdgeStylesModel*) model { - return model; -} - -- (void) setModel:(EdgeStylesModel*)m { - if (m == model) - return; - - EdgeStylesModel *oldModel = model; - model = [m retain]; - gtk_tree_view_set_model (view, [model model]); - [oldModel release]; -} - -- (GtkWidget*) widget { - return GTK_WIDGET (view); -} - -- (EdgeStyle*) selectedStyle { - GtkTreeSelection *sel = gtk_tree_view_get_selection (view); - GtkTreeIter iter; - - if (!gtk_tree_selection_get_selected (sel, NULL, &iter)) { - return nil; - } - - EdgeStyle *style = nil; - gtk_tree_model_get ([model model], &iter, EDGE_STYLES_PTR_COL, &style, -1); - - return style; -} - -- (void) setSelectedStyle:(EdgeStyle*)style { - GtkTreeSelection *sel = gtk_tree_view_get_selection (view); - - if (style == nil) { - gtk_tree_selection_unselect_all (sel); - return; - } - - GtkTreePath *path = [model pathFromStyle:style]; - if (path) { - gtk_tree_selection_unselect_all (sel); - gtk_tree_selection_select_path (sel, path); - gtk_tree_path_free (path); - } -} -@end - -// }}} -// {{{ GTK+ callbacks - -static void selection_changed_cb (GtkTreeSelection *sel, EdgeStyleSelector *mgr) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [[NSNotificationCenter defaultCenter] - postNotificationName:@"SelectedStyleChanged" - object:mgr]; - - [pool drain]; -} -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker - diff --git a/tikzit/src/gtk/EdgeStylesModel.h b/tikzit/src/gtk/EdgeStylesModel.h deleted file mode 100644 index 1166f92..0000000 --- a/tikzit/src/gtk/EdgeStylesModel.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class EdgeStyle; -@class StyleManager; - -enum { - EDGE_STYLES_NAME_COL = 0, - EDGE_STYLES_ICON_COL, - EDGE_STYLES_PTR_COL, - EDGE_STYLES_N_COLS -}; - -@interface EdgeStylesModel: NSObject { - GtkListStore *store; - StyleManager *styleManager; -} - -/*! - @property model - @brief The GTK+ tree model - */ -@property (readonly) GtkTreeModel *model; - -/*! - @property manager - @brief The StyleManager to use. - */ -@property (retain) StyleManager *styleManager; - -/*! - * Initialise with the given style manager - */ -- (id) initWithStyleManager:(StyleManager*)m; - -+ (id) modelWithStyleManager:(StyleManager*)m; - -- (EdgeStyle*) styleFromPath:(GtkTreePath*)path; -- (GtkTreePath*) pathFromStyle:(EdgeStyle*)style; -- (EdgeStyle*) styleFromIter:(GtkTreeIter*)iter; -- (GtkTreeIter*) iterFromStyle:(EdgeStyle*)style; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/EdgeStylesModel.m b/tikzit/src/gtk/EdgeStylesModel.m deleted file mode 100644 index 2de57ed..0000000 --- a/tikzit/src/gtk/EdgeStylesModel.m +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStylesModel.h" - -#import "CairoRenderContext.h" -#import "Edge.h" -#import "Edge+Render.h" -#import "EdgeStyle.h" -#import "Node.h" -#import "StyleManager.h" - -#import "gtkhelpers.h" - -#import <gdk-pixbuf/gdk-pixbuf.h> - -// {{{ Internal interfaces - -@interface EdgeStylesModel (Notifications) -- (void) edgeStylesReplaced:(NSNotification*)notification; -- (void) edgeStyleAdded:(NSNotification*)notification; -- (void) edgeStyleRemoved:(NSNotification*)notification; -- (void) observeValueForKeyPath:(NSString*)keyPath - ofObject:(id)object - change:(NSDictionary*)change - context:(void*)context; -@end - -@interface EdgeStylesModel (Private) -- (cairo_surface_t*) createEdgeIconSurface; -- (GdkPixbuf*) pixbufOfEdgeInStyle:(EdgeStyle*)style; -- (GdkPixbuf*) pixbufOfEdgeInStyle:(EdgeStyle*)style usingSurface:(cairo_surface_t*)surface; -- (void) addEdgeStyle:(EdgeStyle*)style; -- (void) addEdgeStyle:(EdgeStyle*)style usingSurface:(cairo_surface_t*)surface; -- (void) observeEdgeStyle:(EdgeStyle*)style; -- (void) stopObservingEdgeStyle:(EdgeStyle*)style; -- (void) clearEdgeStylesModel; -- (void) reloadEdgeStyles; -@end - -// }}} -// {{{ API - -@implementation EdgeStylesModel - -+ (id) modelWithStyleManager:(StyleManager*)m { - return [[[self alloc] initWithStyleManager:m] autorelease]; -} - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)m { - self = [super init]; - - if (self) { - store = gtk_list_store_new (EDGE_STYLES_N_COLS, - G_TYPE_STRING, - GDK_TYPE_PIXBUF, - G_TYPE_POINTER); - g_object_ref_sink (store); - - [self setStyleManager:m]; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [self clearEdgeStylesModel]; - g_object_unref (store); - [styleManager release]; - - [super dealloc]; -} - -- (GtkTreeModel*) model { - return GTK_TREE_MODEL (store); -} - -- (StyleManager*) styleManager { - return styleManager; -} - -- (void) setStyleManager:(StyleManager*)m { - if (m == nil) { - [NSException raise:NSInvalidArgumentException format:@"Style manager cannot be nil"]; - } - [m retain]; - - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:styleManager]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeStylesReplaced:) - name:@"EdgeStylesReplaced" - object:m]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeStyleAdded:) - name:@"EdgeStyleAdded" - object:m]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeStyleRemoved:) - name:@"EdgeStyleRemoved" - object:m]; - - [styleManager release]; - styleManager = m; - - [self reloadEdgeStyles]; -} - -- (EdgeStyle*) styleFromPath:(GtkTreePath*)path { - GtkTreeIter iter; - gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path); - EdgeStyle *style = nil; - gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, EDGE_STYLES_PTR_COL, &style, -1); - return style; -} - -- (GtkTreePath*) pathFromStyle:(EdgeStyle*)style { - GtkTreeModel *m = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (m, &row)) { - do { - EdgeStyle *rowStyle; - gtk_tree_model_get (m, &row, EDGE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - return gtk_tree_model_get_path (m, &row); - } - } while (gtk_tree_model_iter_next (m, &row)); - } - return NULL; -} - -- (EdgeStyle*) styleFromIter:(GtkTreeIter*)iter { - EdgeStyle *style = nil; - gtk_tree_model_get (GTK_TREE_MODEL (store), iter, EDGE_STYLES_PTR_COL, &style, -1); - return style; -} - -- (GtkTreeIter*) iterFromStyle:(EdgeStyle*)style { - GtkTreeModel *m = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (m, &row)) { - do { - EdgeStyle *rowStyle; - gtk_tree_model_get (m, &row, EDGE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - return gtk_tree_iter_copy (&row); - } - } while (gtk_tree_model_iter_next (m, &row)); - } - return NULL; -} -@end - -// }}} -// {{{ Notifications - -@implementation EdgeStylesModel (Notifications) - -- (void) edgeStylesReplaced:(NSNotification*)notification { - [self reloadEdgeStyles]; -} - -- (void) edgeStyleAdded:(NSNotification*)notification { - [self addEdgeStyle:[[notification userInfo] objectForKey:@"style"]]; -} - -- (void) edgeStyleRemoved:(NSNotification*)notification { - EdgeStyle *style = [[notification userInfo] objectForKey:@"style"]; - - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - EdgeStyle *rowStyle; - gtk_tree_model_get (model, &row, EDGE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - gtk_list_store_remove (store, &row); - [self stopObservingEdgeStyle:rowStyle]; - [rowStyle release]; - return; - } - } while (gtk_tree_model_iter_next (model, &row)); - } -} - -- (void) observeValueForKeyPath:(NSString*)keyPath - ofObject:(id)object - change:(NSDictionary*)change - context:(void*)context -{ - if ([object class] != [EdgeStyle class]) - return; - - EdgeStyle *style = object; - - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - EdgeStyle *rowStyle; - gtk_tree_model_get (model, &row, EDGE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - if ([@"name" isEqual:keyPath]) { - gtk_list_store_set (store, &row, EDGE_STYLES_NAME_COL, [[style name] UTF8String], -1); - } else { - GdkPixbuf *pixbuf = [self pixbufOfEdgeInStyle:style]; - gtk_list_store_set (store, &row, EDGE_STYLES_ICON_COL, pixbuf, -1); - g_object_unref (pixbuf); - } - } - } while (gtk_tree_model_iter_next (model, &row)); - } -} -@end - -// }}} -// {{{ Private - -@implementation EdgeStylesModel (Private) -- (cairo_surface_t*) createEdgeIconSurface { - return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 48, 18); -} - -- (GdkPixbuf*) pixbufOfEdgeInStyle:(EdgeStyle*)style { - cairo_surface_t *surface = [self createEdgeIconSurface]; - GdkPixbuf *pixbuf = [self pixbufOfEdgeInStyle:style usingSurface:surface]; - cairo_surface_destroy (surface); - return pixbuf; -} - -- (GdkPixbuf*) pixbufOfEdgeInStyle:(EdgeStyle*)style usingSurface:(cairo_surface_t*)surface { - Transformer *transformer = [Transformer defaultTransformer]; - [transformer setFlippedAboutXAxis:YES]; - - int width = cairo_image_surface_get_width (surface); - int height = cairo_image_surface_get_height (surface); - NSRect pixbufBounds = NSMakeRect(0.0, 0.0, width, height); - NSRect graphBounds = [transformer rectFromScreen:pixbufBounds]; - - NSPoint start = NSMakePoint (NSMinX (graphBounds) + 0.1f, NSMidY (graphBounds)); - NSPoint end = NSMakePoint (NSMaxX (graphBounds) - 0.1f, NSMidY (graphBounds)); - Node *src = [Node nodeWithPoint:start]; - Node *tgt = [Node nodeWithPoint:end]; - Edge *e = [Edge edgeWithSource:src andTarget:tgt]; - [e setStyle:style]; - - CairoRenderContext *context = [[CairoRenderContext alloc] initForSurface:surface]; - [context clearSurface]; - [e renderBasicEdgeInContext:context withTransformer:transformer selected:NO]; - [context release]; - - return pixbuf_get_from_surface (surface); -} - -- (void) addEdgeStyle:(EdgeStyle*)style usingSurface:(cairo_surface_t*)surface { - GtkTreeIter iter; - gtk_list_store_append (store, &iter); - - GdkPixbuf *pixbuf = [self pixbufOfEdgeInStyle:style usingSurface:surface]; - gtk_list_store_set (store, &iter, - EDGE_STYLES_NAME_COL, [[style name] UTF8String], - EDGE_STYLES_ICON_COL, pixbuf, - EDGE_STYLES_PTR_COL, (gpointer)[style retain], - -1); - g_object_unref (pixbuf); - [self observeEdgeStyle:style]; -} - -- (void) addEdgeStyle:(EdgeStyle*)style { - cairo_surface_t *surface = [self createEdgeIconSurface]; - [self addEdgeStyle:style usingSurface:surface]; - cairo_surface_destroy (surface); -} - -- (void) observeEdgeStyle:(EdgeStyle*)style { - [style addObserver:self - forKeyPath:@"name" - options:NSKeyValueObservingOptionNew - context:NULL]; - [style addObserver:self - forKeyPath:@"thickness" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"headStyle" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"tailStyle" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"decorationStyle" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"colorRGB.red" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"colorRGB.green" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"colorRGB.blue" - options:0 - context:NULL]; -} - -- (void) stopObservingEdgeStyle:(EdgeStyle*)style { - [style removeObserver:self forKeyPath:@"name"]; - [style removeObserver:self forKeyPath:@"thickness"]; - [style removeObserver:self forKeyPath:@"headStyle"]; - [style removeObserver:self forKeyPath:@"tailStyle"]; - [style removeObserver:self forKeyPath:@"decorationStyle"]; - [style removeObserver:self forKeyPath:@"colorRGB.red"]; - [style removeObserver:self forKeyPath:@"colorRGB.green"]; - [style removeObserver:self forKeyPath:@"colorRGB.blue"]; -} - -- (void) clearEdgeStylesModel { - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - EdgeStyle *rowStyle; - gtk_tree_model_get (model, &row, EDGE_STYLES_PTR_COL, &rowStyle, -1); - [self stopObservingEdgeStyle:rowStyle]; - [rowStyle release]; - } while (gtk_tree_model_iter_next (model, &row)); - } - gtk_list_store_clear (store); -} - -- (void) reloadEdgeStyles { - [self clearEdgeStylesModel]; - cairo_surface_t *surface = [self createEdgeIconSurface]; - for (EdgeStyle *style in [styleManager edgeStyles]) { - [self addEdgeStyle:style usingSurface:surface]; - } - cairo_surface_destroy (surface); -} -@end - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/EdgeStylesPalette.h b/tikzit/src/gtk/EdgeStylesPalette.h deleted file mode 100644 index c0c6c4b..0000000 --- a/tikzit/src/gtk/EdgeStylesPalette.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class StyleManager; -@class EdgeStyleSelector; -@class EdgeStyleEditor; - -@interface EdgeStylesPalette: NSObject { - EdgeStyleSelector *selector; - EdgeStyleEditor *editor; - - GtkWidget *palette; - - GtkWidget *removeStyleButton; - GtkWidget *applyStyleButton; - GtkWidget *clearStyleButton; -} - -@property (retain) StyleManager *styleManager; -@property (readonly) GtkWidget *widget; - -- (id) initWithManager:(StyleManager*)m; - -@end - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/EdgeStylesPalette.m b/tikzit/src/gtk/EdgeStylesPalette.m deleted file mode 100644 index 33264cf..0000000 --- a/tikzit/src/gtk/EdgeStylesPalette.m +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "EdgeStylesPalette.h" - -#import "EdgeStylesModel.h" -#import "EdgeStyleSelector.h" -#import "EdgeStyleEditor.h" -#import "StyleManager.h" - -// {{{ Internal interfaces -// {{{ GTK+ Callbacks -static void add_style_button_cb (GtkButton *widget, EdgeStylesPalette *palette); -static void remove_style_button_cb (GtkButton *widget, EdgeStylesPalette *palette); -// }}} -// {{{ Notifications - -@interface EdgeStylesPalette (Notifications) -- (void) selectedStyleChanged:(NSNotification*)notification; -@end - -// }}} -// {{{ Private - -@interface EdgeStylesPalette (Private) -- (void) updateButtonState; -- (void) removeSelectedStyle; -- (void) addStyle; -@end - -// }}} -// }}} -// {{{ API - -@implementation EdgeStylesPalette - -@synthesize widget=palette; - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithManager:(StyleManager*)m { - self = [super init]; - - if (self) { - selector = [[EdgeStyleSelector alloc] initWithStyleManager:m]; - editor = [[EdgeStyleEditor alloc] init]; - - palette = gtk_vbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (palette), 6); - g_object_ref_sink (palette); - - GtkWidget *mainBox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (palette), mainBox, FALSE, FALSE, 0); - gtk_widget_show (mainBox); - - GtkWidget *selectorScroller = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selectorScroller), - GTK_POLICY_NEVER, - GTK_POLICY_AUTOMATIC); - GtkWidget *selectorFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (selectorScroller), [selector widget]); - gtk_container_add (GTK_CONTAINER (selectorFrame), selectorScroller); - gtk_box_pack_start (GTK_BOX (mainBox), selectorFrame, TRUE, TRUE, 0); - gtk_widget_show (selectorScroller); - gtk_widget_show (selectorFrame); - gtk_widget_show ([selector widget]); - - gtk_box_pack_start (GTK_BOX (mainBox), [editor widget], TRUE, TRUE, 0); - gtk_widget_show ([editor widget]); - - GtkBox *buttonBox = GTK_BOX (gtk_hbox_new(FALSE, 0)); - gtk_box_pack_start (GTK_BOX (palette), GTK_WIDGET (buttonBox), FALSE, FALSE, 0); - - GtkWidget *addStyleButton = gtk_button_new (); - gtk_widget_set_tooltip_text (addStyleButton, "Add a new style"); - GtkWidget *addIcon = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (addStyleButton), addIcon); - gtk_box_pack_start (buttonBox, addStyleButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (addStyleButton), - "clicked", - G_CALLBACK (add_style_button_cb), - self); - - removeStyleButton = gtk_button_new (); - g_object_ref_sink (removeStyleButton); - gtk_widget_set_tooltip_text (removeStyleButton, "Delete selected style"); - GtkWidget *removeIcon = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (removeStyleButton), removeIcon); - gtk_box_pack_start (buttonBox, removeStyleButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (removeStyleButton), - "clicked", - G_CALLBACK (remove_style_button_cb), - self); - - gtk_widget_show_all (GTK_WIDGET (buttonBox)); - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(selectedStyleChanged:) - name:@"SelectedStyleChanged" - object:selector]; - - [self updateButtonState]; - } - - return self; -} - -- (StyleManager*) styleManager { - return [[selector model] styleManager]; -} - -- (void) setStyleManager:(StyleManager*)m { - [[selector model] setStyleManager:m]; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [editor release]; - [selector release]; - - g_object_unref (palette); - g_object_unref (removeStyleButton); - - [super dealloc]; -} - -@end - -// }}} -// {{{ Notifications - -@implementation EdgeStylesPalette (Notifications) -- (void) selectedStyleChanged:(NSNotification*)notification { - [editor setStyle:[selector selectedStyle]]; - [self updateButtonState]; -} -@end - -// }}} -// {{{ Private - -@implementation EdgeStylesPalette (Private) -- (void) updateButtonState { - gboolean hasStyleSelection = [selector selectedStyle] != nil; - gtk_widget_set_sensitive (removeStyleButton, hasStyleSelection); -} - -- (void) removeSelectedStyle { - EdgeStyle *style = [selector selectedStyle]; - if (style) - [[[selector model] styleManager] removeEdgeStyle:style]; -} - -- (void) addStyle { - EdgeStyle *newStyle = [EdgeStyle defaultEdgeStyleWithName:@"newstyle"]; - [[self styleManager] addEdgeStyle:newStyle]; - [selector setSelectedStyle:newStyle]; - [editor selectNameField]; -} - -@end - -// }}} -// {{{ GTK+ callbacks - -static void add_style_button_cb (GtkButton *widget, EdgeStylesPalette *palette) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [palette addStyle]; - [pool drain]; -} - -static void remove_style_button_cb (GtkButton *widget, EdgeStylesPalette *palette) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [palette removeSelectedStyle]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/FileChooserDialog.h b/tikzit/src/gtk/FileChooserDialog.h deleted file mode 100644 index 80b03f5..0000000 --- a/tikzit/src/gtk/FileChooserDialog.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@interface FileChooserDialog: NSObject { - GtkFileChooser *dialog; -} - -+ (FileChooserDialog*) saveDialog; -+ (FileChooserDialog*) saveDialogWithParent:(GtkWindow*)parent; -+ (FileChooserDialog*) saveDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent; -+ (FileChooserDialog*) openDialog; -+ (FileChooserDialog*) openDialogWithParent:(GtkWindow*)parent; -+ (FileChooserDialog*) openDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent; - -- (id) initSaveDialog; -- (id) initSaveDialogWithParent:(GtkWindow*)parent; -- (id) initSaveDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent; -- (id) initOpenDialog; -- (id) initOpenDialogWithParent:(GtkWindow*)parent; -- (id) initOpenDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent; - -- (void) addStandardFilters; -- (void) addFileFilter:(NSString*)filterName withPattern:(NSString*)filePattern; -- (void) addFileFilter:(NSString*)filterName withPattern:(NSString*)filePattern setSelected:(BOOL)selected; - -- (void) setCurrentFolder:(NSString*)path; -- (NSString*) currentFolder; - -- (void) setSuggestedName:(NSString*)fileName; - -- (NSString*) filePath; - -- (BOOL) showDialog; - -- (void) destroy; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/FileChooserDialog.m b/tikzit/src/gtk/FileChooserDialog.m deleted file mode 100644 index 9498e4c..0000000 --- a/tikzit/src/gtk/FileChooserDialog.m +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "FileChooserDialog.h" - -@implementation FileChooserDialog: NSObject - -+ (FileChooserDialog*) saveDialog { return [[[self alloc] initSaveDialog] autorelease]; } -+ (FileChooserDialog*) saveDialogWithParent:(GtkWindow*)parent - { return [[[self alloc] initSaveDialogWithParent:parent] autorelease]; } -+ (FileChooserDialog*) saveDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent - { return [[[self alloc] initSaveDialogWithTitle:title parent:parent] autorelease]; } -+ (FileChooserDialog*) openDialog { return [[[self alloc] initOpenDialog] autorelease]; } -+ (FileChooserDialog*) openDialogWithParent:(GtkWindow*)parent - { return [[[self alloc] initOpenDialogWithParent:parent] autorelease]; } -+ (FileChooserDialog*) openDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent - { return [[[self alloc] initOpenDialogWithTitle:title parent:parent] autorelease]; } - -- (id) initSaveDialog { return [self initSaveDialogWithParent:NULL]; } -- (id) initSaveDialogWithParent:(GtkWindow*)parent - { return [self initSaveDialogWithTitle:@"Save file" parent:parent]; } -- (id) initSaveDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent { - self = [super init]; - - if (self) { - dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new ( - [title UTF8String], - parent, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL)); - gtk_file_chooser_set_do_overwrite_confirmation (dialog, TRUE); - } - - return self; -} - -- (id) initOpenDialog { return [self initOpenDialogWithParent:NULL]; } -- (id) initOpenDialogWithParent:(GtkWindow*)parent - { return [self initOpenDialogWithTitle:@"Open file" parent:parent]; } -- (id) initOpenDialogWithTitle:(NSString*)title parent:(GtkWindow*)parent { - self = [super init]; - - if (self) { - dialog = GTK_FILE_CHOOSER (gtk_file_chooser_dialog_new ( - [title UTF8String], - parent, - GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, - NULL)); - } - - return self; -} - -- (void) addStandardFilters { - GtkFileFilter *tikzfilter = gtk_file_filter_new(); - gtk_file_filter_set_name(tikzfilter, ".tikz files"); - gtk_file_filter_add_pattern(tikzfilter, "*.tikz"); - gtk_file_chooser_add_filter(dialog, tikzfilter); - GtkFileFilter *allfilter = gtk_file_filter_new(); - gtk_file_filter_set_name(allfilter, "all files"); - gtk_file_filter_add_pattern(allfilter, "*"); - gtk_file_chooser_add_filter(dialog, allfilter); - gtk_file_chooser_set_filter(dialog, tikzfilter); -} - -- (void) addFileFilter:(NSString*)filterName withPattern:(NSString*)filePattern { - [self addFileFilter:filterName withPattern:filePattern setSelected:NO]; -} - -- (void) addFileFilter:(NSString*)filterName withPattern:(NSString*)filePattern setSelected:(BOOL)selected { - GtkFileFilter *oldFilter = selected ? NULL : gtk_file_chooser_get_filter (dialog); - GtkFileFilter *filter = gtk_file_filter_new(); - gtk_file_filter_set_name(filter, [filterName UTF8String]); - gtk_file_filter_add_pattern(filter, [filePattern UTF8String]); - gtk_file_chooser_add_filter(dialog, filter); - if (selected) { - gtk_file_chooser_set_filter (dialog, filter); - } else if (oldFilter) { - gtk_file_chooser_set_filter (dialog, oldFilter); - } -} - -- (void) setCurrentFolder:(NSString*)path { - gchar *folder = [path glibFilename]; - if (folder) { - gtk_file_chooser_set_current_folder(dialog, folder); - g_free (folder); - } -} - -- (NSString*) currentFolder { - NSString *path = nil; - gchar *folder = gtk_file_chooser_get_current_folder(dialog); - if (folder) { - path = [NSString stringWithGlibFilename:folder]; - g_free (folder); - } - return path; -} - -- (void) setSuggestedName:(NSString*)fileName { - gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), [fileName UTF8String]); -} - -- (NSString*) filePath { - NSString *path = nil; - gchar *filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog)); - if (filename) { - path = [NSString stringWithGlibFilename:filename]; - g_free (filename); - } - return path; -} - -- (BOOL) showDialog { - return (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) ? YES : NO; -} - -- (void) destroy { - gtk_widget_destroy (GTK_WIDGET (dialog)); - dialog = NULL; -} - -- (void) dealloc { - if (dialog) { - g_warning ("Failed to destroy file chooser dialog!\n"); - gtk_widget_destroy (GTK_WIDGET (dialog)); - } - [super dealloc]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/GraphEditorPanel.h b/tikzit/src/gtk/GraphEditorPanel.h deleted file mode 100644 index 2b93259..0000000 --- a/tikzit/src/gtk/GraphEditorPanel.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Tool.h" -#import <gtk/gtk.h> - -@class GraphInputHandler; -@class GraphRenderer; -@class TikzDocument; -@class WidgetSurface; - -@protocol PreviewHandler <NSObject> -- (void) showPreview; -@end -@interface GraphEditorPanel : NSObject { - GraphRenderer *renderer; - WidgetSurface *surface; - GraphInputHandler *inputHandler; - id<PreviewHandler> previewHandler; - id<Tool> tool; -} -@property (retain) TikzDocument *document; -@property (readonly) GtkWidget *widget; -@property (retain) id<Tool> activeTool; -@property (assign) id<PreviewHandler> previewHandler; - -- (id) init; -- (id) initWithDocument:(TikzDocument*)document; -- (void) grabTool; -- (void) zoomInAboutPoint:(NSPoint)pos; -- (void) zoomOutAboutPoint:(NSPoint)pos; -- (void) zoomIn; -- (void) zoomOut; -- (void) zoomReset; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/GraphEditorPanel.m b/tikzit/src/gtk/GraphEditorPanel.m deleted file mode 100644 index dac52a0..0000000 --- a/tikzit/src/gtk/GraphEditorPanel.m +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "GraphEditorPanel.h" - -#import "Application.h" -#import "GraphRenderer.h" -#import "HandTool.h" -#import "InputDelegate.h" -#import "TikzDocument.h" -#import "WidgetSurface.h" - -#import <gdk/gdkkeysyms.h> - -@class GraphRenderer; -@class WidgetSurface; - -static const InputMask zoomPanMask = ControlMask; - -/** - * Mostly just a multiplexer, but also handles zoom and pan - * when ctrl is held - */ -@interface GraphInputHandler : NSObject<InputDelegate> { - GraphEditorPanel *panel; - NSPoint dragOrigin; - NSPoint oldGraphOrigin; - BOOL zoomPanActive; -} -- (id) initForPanel:(GraphEditorPanel*)p; -@end - -@implementation GraphEditorPanel - -@synthesize previewHandler; - -- (id) init { - return [self initWithDocument:nil]; -} -- (id) initWithDocument:(TikzDocument*)document { - self = [super init]; - if (self) { - surface = [[WidgetSurface alloc] init]; - [surface setDefaultScale:50.0f]; - [surface setKeepCentered:YES]; - [surface setCanFocus:YES]; - renderer = [[GraphRenderer alloc] initWithSurface:surface document:document]; - - inputHandler = [[GraphInputHandler alloc] initForPanel:self]; - [surface setInputDelegate:inputHandler]; - } - return self; -} - -- (void) dealloc { - [renderer release]; - [surface release]; - [inputHandler release]; - - [super dealloc]; -} - -- (GraphRenderer*) renderer { - return renderer; -} -- (TikzDocument*) document { - return [renderer document]; -} -- (void) setDocument:(TikzDocument*)doc { - [renderer setDocument:doc]; -} -- (GtkWidget*) widget { - return [surface widget]; -} -- (id<Tool>) activeTool { - return tool; -} -- (void) setActiveTool:(id<Tool>)t { - if (t == tool) - return; - - [[[renderer document] pickSupport] deselectAllNodes]; - [[[renderer document] pickSupport] deselectAllEdges]; - - id oldTool = tool; - BOOL weHadTool = ([oldTool activeRenderer] == renderer); - if (weHadTool) { - [oldTool setActiveRenderer:nil]; - } - - tool = [t retain]; - [oldTool release]; - - if (weHadTool) { - [self grabTool]; - } -} - -- (BOOL) hasTool { - return [tool activeRenderer] == renderer; -} - -- (void) grabTool { - if ([tool activeRenderer] != renderer) { - [[tool activeRenderer] setPostRenderer:nil]; - [tool setActiveRenderer:renderer]; - } - [renderer setPostRenderer:tool]; -} - -- (void) zoomInAboutPoint:(NSPoint)pos { [surface zoomInAboutPoint:pos]; } -- (void) zoomOutAboutPoint:(NSPoint)pos { [surface zoomOutAboutPoint:pos]; } -- (void) zoomIn { [surface zoomIn]; } -- (void) zoomOut { [surface zoomOut]; } -- (void) zoomReset { [surface zoomReset]; } - -@end - -@implementation GraphInputHandler -- (id) initForPanel:(GraphEditorPanel*)p { - self = [super init]; - if (self) { - // NB: no retention! - panel = p; - } - return self; -} -- (id) init { - [self release]; - return nil; -} -- (void) dealloc { - [super dealloc]; -} - -// FIXME: share code with HandTool? -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (mask == zoomPanMask && button == LeftButton) { - dragOrigin = pos; - oldGraphOrigin = [[[panel renderer] transformer] origin]; - zoomPanActive = YES; - } else { - zoomPanActive = NO; - [panel grabTool]; - id<Tool> tool = [panel activeTool]; - if ([tool respondsToSelector:@selector(mousePressAt:withButton:andMask:)]) { - [tool mousePressAt:pos withButton:button andMask:mask]; - } - } -} - -- (void) mouseDoubleClickAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - [panel grabTool]; - id<Tool> tool = [panel activeTool]; - if ([tool respondsToSelector:@selector(mouseDoubleClickAt:withButton:andMask:)]) { - [tool mouseDoubleClickAt:pos withButton:button andMask:mask]; - } -} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (zoomPanActive && button == LeftButton) { - zoomPanActive = NO; - } else if ([panel hasTool]) { - id<Tool> tool = [panel activeTool]; - if ([tool respondsToSelector:@selector(mouseReleaseAt:withButton:andMask:)]) { - [tool mouseReleaseAt:pos withButton:button andMask:mask]; - } - } -} - -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { - if (zoomPanActive && (buttons & LeftButton)) { - NSPoint newGraphOrigin = oldGraphOrigin; - newGraphOrigin.x += pos.x - dragOrigin.x; - newGraphOrigin.y += pos.y - dragOrigin.y; - [[[panel renderer] transformer] setOrigin:newGraphOrigin]; - [[panel renderer] invalidateGraph]; - } else if ([panel hasTool]) { - id<Tool> tool = [panel activeTool]; - if ([tool respondsToSelector:@selector(mouseMoveTo:withButtons:andMask:)]) { - [tool mouseMoveTo:pos withButtons:buttons andMask:mask]; - } - } -} - -- (void) mouseScrolledAt:(NSPoint)pos inDirection:(ScrollDirection)dir withMask:(InputMask)mask { - if (mask == zoomPanMask) { - if (dir == ScrollUp) { - [panel zoomInAboutPoint:pos]; - } else if (dir == ScrollDown) { - [panel zoomOutAboutPoint:pos]; - } - } else { - id<Tool> tool = [panel activeTool]; - if ([panel hasTool] && [tool respondsToSelector:@selector(mouseScrolledAt:inDirection:withMask:)]) { - [tool mouseScrolledAt:pos inDirection:dir withMask:mask]; - } - } -} - -- (void) keyPressed:(unsigned int)keyVal withMask:(InputMask)mask { - if (keyVal == GDK_KEY_space && !mask) { - return; - } - if (![app activateToolForKey:keyVal withMask:mask]) { - id<Tool> tool = [panel activeTool]; - if ([panel hasTool] && [tool respondsToSelector:@selector(keyPressed:withMask:)]) { - [tool keyPressed:keyVal withMask:mask]; - } - } -} - -- (void) keyReleased:(unsigned int)keyVal withMask:(InputMask)mask { - if (keyVal == GDK_KEY_space && !mask) { - [[panel previewHandler] showPreview]; - } - if (![app activateToolForKey:keyVal withMask:mask]) { - id<Tool> tool = [panel activeTool]; - if ([panel hasTool] && [tool respondsToSelector:@selector(keyReleased:withMask:)]) { - [tool keyReleased:keyVal withMask:mask]; - } - } -} -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/GraphRenderer.h b/tikzit/src/gtk/GraphRenderer.h deleted file mode 100644 index 730d606..0000000 --- a/tikzit/src/gtk/GraphRenderer.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -// classes -#import "Graph.h" -#import "Grid.h" -#import "PickSupport.h" -#import "TikzDocument.h" - -// protocols -#import "Surface.h" - -@interface GraphRenderer: NSObject <RenderDelegate> { - TikzDocument *doc; - NSObject<Surface> *surface; - Grid *grid; - NSMutableSet *highlightedNodes; - id<RenderDelegate> postRenderer; -} - -@property (retain) id<RenderDelegate> postRenderer; - -- (id) initWithSurface:(NSObject <Surface> *)surface; -- (id) initWithSurface:(NSObject <Surface> *)surface document:(TikzDocument*)document; -- (void) renderWithContext:(id<RenderContext>)context; -- (void) invalidateRect:(NSRect)rect; -- (void) invalidateGraph; -- (void) invalidateNode:(Node*)node; -- (void) invalidateEdge:(Edge*)edge; -- (void) invalidateNodesHitBy:(NSPoint)point; -- (BOOL) point:(NSPoint)p hitsNode:(Node*)node; -- (BOOL) point:(NSPoint)p hitsEdge:(Edge*)edge withFuzz:(float)fuzz; -/** - * Finds a node at the given screen location. - * - * If there is more than one node at this point (because they overlap), - * an arbitrary one is returned. - */ -- (Node*) anyNodeAt:(NSPoint)p; -/** - * Finds an edge at the given screen location. - * - * If there is more than one edge at this point (because they overlap), - * an arbitrary one is returned. - * - * @param fuzz the fuzz for detecting edges: this will pick up - * edges that are close to the point - */ -- (Edge*) anyEdgeAt:(NSPoint)p withFuzz:(float)fuzz; - -- (id<Surface>) surface; -- (Transformer*) transformer; -- (Grid*) grid; -- (PickSupport*) pickSupport; - -- (Graph*) graph; - -- (TikzDocument*) document; -- (void) setDocument:(TikzDocument*)document; - -- (BOOL) isNodeHighlighted:(Node*)node; -- (void) setNode:(Node*)node highlighted:(BOOL)h; -- (void) clearHighlightedNodes; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/GraphRenderer.m b/tikzit/src/gtk/GraphRenderer.m deleted file mode 100644 index b413d3e..0000000 --- a/tikzit/src/gtk/GraphRenderer.m +++ /dev/null @@ -1,476 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "GraphRenderer.h" -#import "Edge+Render.h" -#import "Node+Render.h" -#import "Shape.h" - -void graph_renderer_expose_event(GtkWidget *widget, GdkEventExpose *event); - -@interface GraphRenderer (Private) -- (enum NodeState) nodeState:(Node*)node; -- (void) renderBoundingBoxWithContext:(id<RenderContext>)context; -- (void) nodeNeedsRefreshing:(NSNotification*)notification; -- (void) edgeNeedsRefreshing:(NSNotification*)notification; -- (void) graphNeedsRefreshing:(NSNotification*)notification; -- (void) graphChanged:(NSNotification*)notification; -- (void) nodeStylePropertyChanged:(NSNotification*)notification; -- (void) edgeStylePropertyChanged:(NSNotification*)notification; -- (void) shapeDictionaryReplaced:(NSNotification*)notification; -@end - -@implementation GraphRenderer - -- (id) initWithSurface:(NSObject <Surface> *)s { - self = [super init]; - - if (self) { - surface = [s retain]; - grid = [[Grid alloc] initWithSpacing:1.0f subdivisions:4 transformer:[s transformer]]; - highlightedNodes = [[NSMutableSet alloc] initWithCapacity:10]; - [surface setRenderDelegate:self]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeStylePropertyChanged:) - name:@"NodeStylePropertyChanged" - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeStylePropertyChanged:) - name:@"EdgeStylePropertyChanged" - object:nil]; - } - - return self; -} - -- (id) initWithSurface:(NSObject <Surface> *)s document:(TikzDocument*)document { - self = [self initWithSurface:s]; - - if (self) { - [self setDocument:document]; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [doc release]; - [grid release]; - [highlightedNodes release]; - [surface release]; - - [super dealloc]; -} - -- (id<RenderDelegate>) postRenderer { - return postRenderer; -} -- (void) setPostRenderer:(id<RenderDelegate>)r { - if (r == postRenderer) - return; - - [r retain]; - [postRenderer release]; - postRenderer = r; - - [self invalidateGraph]; -} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)s { - [self renderWithContext:context]; - if ([s hasFocus]) { - [s renderFocus]; - } -} - -- (void) renderWithContext:(id<RenderContext>)context { - // blank surface - [context paintWithColor:WhiteRColor]; - - // draw grid - [grid renderGridInContext:context]; - - // draw edges - NSEnumerator *enumerator = [doc edgeEnumerator]; - Edge *edge; - while ((edge = [enumerator nextObject]) != nil) { - [edge renderToSurface:surface withContext:context selected:[doc isEdgeSelected:edge]]; - } - - // draw nodes - enumerator = [doc nodeEnumerator]; - Node *node; - while ((node = [enumerator nextObject]) != nil) { - [node renderToSurface:surface withContext:context state:[self nodeState:node]]; - } - - [self renderBoundingBoxWithContext:context]; - [postRenderer renderWithContext:context onSurface:surface]; -} - -- (void) invalidateGraph { - [surface invalidate]; -} - -- (void) invalidateRect:(NSRect)rect { - [surface invalidateRect:rect]; -} - -- (void) invalidateNodes:(NSSet*)nodes { - for (Node *node in nodes) { - [self invalidateNode:node]; - } -} - -- (void) invalidateEdges:(NSSet*)edges { - for (Edge *edge in edges) { - [self invalidateEdge:edge]; - } -} - -- (void) invalidateNode:(Node*)node { - if (node == nil) { - return; - } - NSRect nodeRect = [node renderBoundsWithLabelForSurface:surface]; - nodeRect = NSInsetRect (nodeRect, -2.0f, -2.0f); - [surface invalidateRect:nodeRect]; -} - -- (void) invalidateEdge:(Edge*)edge { - if (edge == nil) { - return; - } - BOOL selected = [doc isEdgeSelected:edge]; - NSRect edgeRect = [edge renderedBoundsWithTransformer:[surface transformer] whenSelected:selected]; - edgeRect = NSInsetRect (edgeRect, -2.0f, -2.0f); - [surface invalidateRect:edgeRect]; -} - -- (void) invalidateNodesHitBy:(NSPoint)point { - NSEnumerator *enumerator = [doc nodeEnumerator]; - Node *node = nil; - while ((node = [enumerator nextObject]) != nil) { - if ([self point:point hitsNode:node]) { - [self invalidateNode:node]; - } - } -} - -- (BOOL) point:(NSPoint)p hitsNode:(Node*)node { - return [node hitByPoint:p onSurface:surface]; -} - -- (BOOL) point:(NSPoint)p fuzzyHitsNode:(Node*)node { - NSRect bounds = [node renderBoundsForSurface:surface]; - return NSPointInRect(p, bounds); -} - -- (BOOL) point:(NSPoint)p hitsEdge:(Edge*)edge withFuzz:(float)fuzz { - return [edge hitByPoint:p onSurface:surface withFuzz:fuzz]; -} - -- (Node*) anyNodeAt:(NSPoint)p { - NSEnumerator *enumerator = [doc nodeEnumerator]; - Node *node; - while ((node = [enumerator nextObject]) != nil) { - if ([self point:p hitsNode:node]) { - return node; - } - } - return nil; -} - -- (Edge*) anyEdgeAt:(NSPoint)p withFuzz:(float)fuzz { - // FIXME: is there an efficient way to find the "nearest" edge - // if the fuzz is the reason we hit more than one? - NSEnumerator *enumerator = [doc edgeEnumerator]; - Edge *edge; - while ((edge = [enumerator nextObject]) != nil) { - if ([self point:p hitsEdge:edge withFuzz:fuzz]) { - return edge; - } - } - return nil; -} - -- (id<Surface>) surface { - return surface; -} - -- (Transformer*) transformer { - return [surface transformer]; -} - -- (Grid*) grid { - return grid; -} - -- (PickSupport*) pickSupport { - return [doc pickSupport]; -} - -- (Graph*) graph { - return [doc graph]; -} - -- (TikzDocument*) document { - return doc; -} - -- (void) setDocument:(TikzDocument*)document { - if (doc == document) { - return; - } - - if (doc != nil) { - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:doc]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:[doc pickSupport]]; - } - - [document retain]; - [doc release]; - doc = document; - - if (doc != nil) { - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphNeedsRefreshing:) - name:@"GraphReplaced" object:doc]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphChanged:) - name:@"GraphChanged" object:doc]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphChanged:) - name:@"GraphBeingChanged" object:doc]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphChanged:) - name:@"GraphChangeCancelled" object:doc]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(nodeNeedsRefreshing:) - name:@"NodeSelected" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(nodeNeedsRefreshing:) - name:@"NodeDeselected" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphNeedsRefreshing:) - name:@"NodeSelectionReplaced" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(edgeNeedsRefreshing:) - name:@"EdgeSelected" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(edgeNeedsRefreshing:) - name:@"EdgeDeselected" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(graphNeedsRefreshing:) - name:@"EdgeSelectionReplaced" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(shapeDictionaryReplaced:) - name:@"ShapeDictionaryReplaced" - object:[Shape class]]; - } - [surface invalidate]; -} - -- (BOOL) isNodeHighlighted:(Node*)node { - return [highlightedNodes containsObject:node]; -} -- (void) setNode:(Node*)node highlighted:(BOOL)h { - if (h) { - if (![highlightedNodes containsObject:node]) { - [highlightedNodes addObject:node]; - [self invalidateNode:node]; - } - } else { - if ([highlightedNodes containsObject:node]) { - [highlightedNodes removeObject:node]; - [self invalidateNode:node]; - } - } -} -- (void) clearHighlightedNodes { - [self invalidateNodes:highlightedNodes]; - [highlightedNodes removeAllObjects]; -} - -@end - -@implementation GraphRenderer (Private) -- (enum NodeState) nodeState:(Node*)node { - if ([doc isNodeSelected:node]) { - return NodeSelected; - } else if ([self isNodeHighlighted:node]) { - return NodeHighlighted; - } else { - return NodeNormal; - } -} - -- (void) renderBoundingBoxWithContext:(id<RenderContext>)context { - if ([[self graph] hasBoundingBox]) { - [context saveState]; - - NSRect bbox = [[surface transformer] rectToScreen:[[self graph] boundingBox]]; - - [context setAntialiasMode:AntialiasDisabled]; - [context setLineWidth:1.0]; - [context startPath]; - [context rect:bbox]; - [context strokePathWithColor:MakeSolidRColor (1.0, 0.7, 0.5)]; - - [context restoreState]; - } -} - -- (void) nodeNeedsRefreshing:(NSNotification*)notification { - [self invalidateNode:[[notification userInfo] objectForKey:@"node"]]; -} - -- (void) edgeNeedsRefreshing:(NSNotification*)notification { - Edge *edge = [[notification userInfo] objectForKey:@"edge"]; - NSRect edgeRect = [edge renderedBoundsWithTransformer:[surface transformer] whenSelected:YES]; - edgeRect = NSInsetRect (edgeRect, -2, -2); - [surface invalidateRect:edgeRect]; -} - -- (void) graphNeedsRefreshing:(NSNotification*)notification { - [self invalidateGraph]; -} - -- (void) invalidateBentIncidentEdgesForNode:(Node*)nd { - for (Edge *e in [[self graph] inEdgesForNode:nd]) { - if (![e isStraight]) { - [self invalidateEdge:e]; - } - } - for (Edge *e in [[self graph] outEdgesForNode:nd]) { - if (![e isStraight]) { - [self invalidateEdge:e]; - } - } -} - -- (void) graphChanged:(NSNotification*)notification { - GraphChange *change = [[notification userInfo] objectForKey:@"change"]; - switch ([change changeType]) { - case GraphAddition: - case GraphDeletion: - [self invalidateNodes:[change affectedNodes]]; - [self invalidateEdges:[change affectedEdges]]; - break; - case NodePropertyChange: - if (!NSEqualPoints ([[change oldNode] point], [[change nwNode] point])) { - // if the node has moved, it may be affecting edges - [surface invalidate]; - } else if ([[change oldNode] style] != [[change nwNode] style]) { - // change in style means that edges may touch at a different point, - // but this only matters for bent edges - [self invalidateBentIncidentEdgesForNode:[change nodeRef]]; - // invalide both old and new (old node may be larger) - [self invalidateNode:[change oldNode]]; - [self invalidateNode:[change nwNode]]; - } else { - // invalide both old and new (old node may be larger) - [self invalidateNode:[change oldNode]]; - [self invalidateNode:[change nwNode]]; - } - break; - case EdgePropertyChange: - // invalide both old and new (old bend may increase bounds) - [self invalidateEdge:[change oldEdge]]; - [self invalidateEdge:[change nwEdge]]; - [self invalidateEdge:[change edgeRef]]; - break; - case NodesPropertyChange: - { - NSEnumerator *enumerator = [[change oldNodeTable] keyEnumerator]; - Node *node = nil; - while ((node = [enumerator nextObject]) != nil) { - NSPoint oldPos = [[[change oldNodeTable] objectForKey:node] point]; - NSPoint newPos = [[[change nwNodeTable] objectForKey:node] point]; - NodeStyle *oldStyle = [[[change oldNodeTable] objectForKey:node] style]; - NodeStyle *newStyle = [[[change nwNodeTable] objectForKey:node] style]; - if (!NSEqualPoints (oldPos, newPos)) { - [surface invalidate]; - break; - } else if (oldStyle != newStyle) { - [self invalidateBentIncidentEdgesForNode:node]; - [self invalidateNode:[[change oldNodeTable] objectForKey:node]]; - [self invalidateNode:[[change nwNodeTable] objectForKey:node]]; - } else { - [self invalidateNode:[[change oldNodeTable] objectForKey:node]]; - [self invalidateNode:[[change nwNodeTable] objectForKey:node]]; - } - } - } - break; - case NodesShift: - case NodesFlip: - case BoundingBoxChange: - [surface invalidate]; - break; - default: - // unknown change - [surface invalidate]; - break; - }; -} - -- (void) nodeStylePropertyChanged:(NSNotification*)notification { - if (![@"name" isEqual:[[notification userInfo] objectForKey:@"propertyName"]]) { - BOOL affected = NO; - for (Node *node in [[self graph] nodes]) { - if ([node style] == [notification object]) - affected = YES; - } - if (affected) - [surface invalidate]; - } -} - -- (void) edgeStylePropertyChanged:(NSNotification*)notification { - if (![@"name" isEqual:[[notification userInfo] objectForKey:@"propertyName"]]) { - BOOL affected = NO; - for (Edge *edge in [[self graph] edges]) { - if ([edge style] == [notification object]) - affected = YES; - } - if (affected) - [surface invalidate]; - } -} - -- (void) shapeDictionaryReplaced:(NSNotification*)notification { - [surface invalidate]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/HandTool.h b/tikzit/src/gtk/HandTool.h deleted file mode 100644 index c96de36..0000000 --- a/tikzit/src/gtk/HandTool.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Tool.h" - -@interface HandTool : NSObject <Tool> { - GraphRenderer *renderer; - NSPoint dragOrigin; - NSPoint oldGraphOrigin; -} - - -+ (id) tool; -- (id) init; -@end - - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/HandTool.m b/tikzit/src/gtk/HandTool.m deleted file mode 100644 index c3a0fb4..0000000 --- a/tikzit/src/gtk/HandTool.m +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "HandTool.h" - -#import "GraphRenderer.h" -#import "TikzDocument.h" -#import "tzstockitems.h" - -@implementation HandTool -- (NSString*) name { return @"Drag"; } -- (const gchar*) stockId { return TIKZIT_STOCK_DRAG; } -- (NSString*) helpText { return @"Move the diagram to view different parts"; } -- (NSString*) shortcut { return @"m"; } -@synthesize activeRenderer=renderer; - -+ (id) tool { - return [[[self alloc] init] autorelease]; -} - -- (id) init { - return [super init]; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [renderer release]; - - [super dealloc]; -} - -- (GtkWidget*) configurationWidget { return NULL; } - -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - dragOrigin = pos; - oldGraphOrigin = [[renderer transformer] origin]; -} - -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { - if (!(buttons & LeftButton)) - return; - - NSPoint newGraphOrigin = oldGraphOrigin; - newGraphOrigin.x += pos.x - dragOrigin.x; - newGraphOrigin.y += pos.y - dragOrigin.y; - [[renderer transformer] setOrigin:newGraphOrigin]; - [renderer invalidateGraph]; -} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask {} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface {} -- (void) loadConfiguration:(Configuration*)config {} -- (void) saveConfiguration:(Configuration*)config {} -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/InputDelegate.h b/tikzit/src/gtk/InputDelegate.h deleted file mode 100644 index 9f9b426..0000000 --- a/tikzit/src/gtk/InputDelegate.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" - -typedef enum { - LeftButton = 1, - MiddleButton = 2, - RightButton = 3, - Button4 = 4, - Button5 = 5 -} MouseButton; - -typedef enum { - ShiftMask = 1, - ControlMask = 2, - MetaMask = 4 -} InputMask; - -typedef enum { - ScrollUp = 1, - ScrollDown = 2, - ScrollLeft = 3, - ScrollRight = 4, -} ScrollDirection; - -@protocol InputDelegate <NSObject> -@optional -/** - * A mouse button was pressed. - */ -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask; -/** - * A mouse button was released. - */ -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask; -/** - * A mouse button was double-clicked. - * - * Note that mouseDown and mouseUp events will still be delivered. - * This will be triggered between the second mouseDown and the second - * mouseUp. - */ -- (void) mouseDoubleClickAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask; -/** - * The mouse was moved - */ -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)button andMask:(InputMask)mask; -/** - * The mouse was scrolled - */ -- (void) mouseScrolledAt:(NSPoint)pos inDirection:(ScrollDirection)dir withMask:(InputMask)mask; -/** - * A key was pressed - */ -- (void) keyPressed:(unsigned int)keyVal withMask:(InputMask)mask; -/** - * A key was released - */ -- (void) keyReleased:(unsigned int)keyVal withMask:(InputMask)mask; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Menu.h b/tikzit/src/gtk/Menu.h deleted file mode 100644 index e0f78d4..0000000 --- a/tikzit/src/gtk/Menu.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Window; -@class PickSupport; - -/** - * Manages the menu - */ -@interface Menu: NSObject { - GtkWidget *menubar; - GtkActionGroup *appActions; - GtkActionGroup *windowActions; - GtkAction *undoAction; // no ref - GtkAction *redoAction; // no ref - GtkAction *pasteAction; // no ref - GtkAction **nodeSelBasedActions; - guint nodeSelBasedActionCount; - GtkAction **edgeSelBasedActions; - guint edgeSelBasedActionCount; - GtkAction **selBasedActions; - guint selBasedActionCount; -} - -/** - * The menubar widget, to be inserted into the window - */ -@property (readonly) GtkWidget *menubar; - -/** - * Constructs the menu for @p window - * - * @param window the window that will be acted upon - */ -- (id) initForWindow:(Window*)window; - -/** - * Enables or disables the undo action - */ -- (void) setUndoActionEnabled:(BOOL)enabled; -/** - * Sets the text that describes what action will be undone - * - * @param detail a text description of the action, or nil - */ -- (void) setUndoActionDetail:(NSString*)detail; -/** - * Enables or disables the redo action - */ -- (void) setRedoActionEnabled:(BOOL)enabled; -/** - * Sets the text that describes what action will be redone - * - * @param detail a text description of the action, or nil - */ -- (void) setRedoActionDetail:(NSString*)detail; - -/** - * Gets the paste action - */ -- (GtkAction*) pasteAction; - -/** - * Enables or disables the actions that act on a selection - */ -- (void) notifySelectionChanged:(PickSupport*)pickSupport; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Menu.m b/tikzit/src/gtk/Menu.m deleted file mode 100644 index 04c9c31..0000000 --- a/tikzit/src/gtk/Menu.m +++ /dev/null @@ -1,737 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * Stuff stolen from glade-window.c in Glade: - * Copyright (C) 2001 Ximian, Inc. - * Copyright (C) 2007 Vincent Geddes. - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Menu.h" - -#import "Application.h" -#import "Window.h" -#import "Configuration.h" -#import "PickSupport.h" -#import "Shape.h" -#import "Tool.h" -#import "TikzDocument.h" - -#import <glib.h> -#ifdef _ -#undef _ -#endif -#import <glib/gi18n.h> -#import <gtk/gtk.h> - -#import "gtkhelpers.h" - -#import "logo.h" - -// {{{ Application actions -static void new_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [appl newWindow]; - [pool drain]; -} - -static void refresh_shapes_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [Shape refreshShapeDictionary]; - [pool drain]; -} - -static void show_preferences_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [appl presentSettingsDialog]; - [pool drain]; -} - -#ifdef HAVE_POPPLER -static void show_preamble_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [appl presentPreamblesEditor]; - [pool drain]; -} -#endif - -static void show_context_window_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [appl presentContextWindow]; - [pool drain]; -} - -static void quit_cb (GtkAction *action, Application *appl) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [appl quit]; - [pool drain]; -} - -static void help_cb (GtkAction *action, Application *appl) { - GError *gerror = NULL; - gtk_show_uri (NULL, "http://tikzit.sourceforge.net/manual.html", GDK_CURRENT_TIME, &gerror); - if (gerror != NULL) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - logGError (gerror, @"Could not show help"); - [pool drain]; - } -} - -static void about_cb (GtkAction *action, Application *appl) { - static const gchar * const authors[] = - { "Aleks Kissinger <aleks0@gmail.com>", - "Chris Heunen <chrisheunen@gmail.com>", - "Alex Merry <dev@randomguy3.me.uk>", - NULL }; - - static const gchar license[] = - N_("TikZiT 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." - "\n\n" - "TikZiT 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." - "\n\n" - "You should have received a copy of the GNU General Public License " - "along with TikZiT; if not, write to the Free Software " - "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, " - "MA 02110-1301, USA."); - - static const gchar copyright[] = - "Copyright \xc2\xa9 2010-2011 Aleks Kissinger, Chris Heunen and Alex Merry."; - - GdkPixbuf *logo = get_logo (LOGO_SIZE_128); - gtk_show_about_dialog (NULL, - "program-name", PACKAGE_NAME, - "logo", logo, - "authors", authors, - "translator-credits", _("translator-credits"), - "comments", _("A graph manipulation program for pgf/tikz graphs"), - "license", _(license), - "wrap-license", TRUE, - "copyright", copyright, - "version", PACKAGE_VERSION, - "website", "http://tikzit.sourceforge.net", - NULL); - g_object_unref (logo); -} - -static GtkActionEntry app_action_entries[] = { - /* - Fields: - * action name - * stock id or name of icon for action - * label for action (mark for translation with N_) - * accelerator (as understood by gtk_accelerator_parse()) - * tooltip (mark for translation with N_) - * callback - */ - { "New", GTK_STOCK_NEW, NULL, "<control>N", - N_("Create a new graph"), G_CALLBACK (new_cb) }, - - { "RefreshShapes", NULL, N_("_Refresh shapes"), NULL, - N_(""), G_CALLBACK (refresh_shapes_cb) }, - - { "Quit", GTK_STOCK_QUIT, NULL, "<control>Q", - N_("Quit the program"), G_CALLBACK (quit_cb) }, - - { "Tool", NULL, N_("_Tool") }, - - { "ShowPreferences", GTK_STOCK_PREFERENCES, N_("Configure TikZiT..."), NULL, - N_("Edit the TikZiT configuration"), G_CALLBACK (show_preferences_cb) }, - -#ifdef HAVE_POPPLER - { "ShowPreamble", NULL, N_("_Edit Preambles..."), NULL, - N_("Edit the preambles used to generate the preview"), G_CALLBACK (show_preamble_cb) }, -#endif - - { "ShowContextWindow", NULL, N_("_Context Window"), NULL, - N_("Show the contextual tools window"), G_CALLBACK (show_context_window_cb) }, - - /* HelpMenu */ - { "HelpManual", GTK_STOCK_HELP, N_("_Online manual"), "F1", - N_("TikZiT manual (online)"), G_CALLBACK (help_cb) }, - - { "About", GTK_STOCK_ABOUT, NULL, NULL, - N_("About this application"), G_CALLBACK (about_cb) }, -}; -static guint n_app_action_entries = G_N_ELEMENTS (app_action_entries); -// }}} -// {{{ Window actions - -static void open_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window openFile]; - [pool drain]; -} - -static void close_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window close]; - [pool drain]; -} - -static void save_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window saveActiveDocument]; - [pool drain]; -} - -static void save_as_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window saveActiveDocumentAs]; - [pool drain]; -} - -static void save_as_shape_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window saveActiveDocumentAsShape]; - [pool drain]; -} - -static void undo_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - TikzDocument *document = [window document]; - if ([document canUndo]) { - [document undo]; - } else { - g_warning ("Can't undo!\n"); - gtk_action_set_sensitive (action, FALSE); - } - - [pool drain]; -} - -static void redo_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - TikzDocument *document = [window document]; - if ([document canRedo]) { - [document redo]; - } else { - g_warning ("Can't redo!\n"); - gtk_action_set_sensitive (action, FALSE); - } - - [pool drain]; -} - -static void cut_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window selectionCutToClipboard]; - [pool drain]; -} - -static void copy_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window selectionCopyToClipboard]; - [pool drain]; -} - -static void paste_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window pasteFromClipboard]; - [pool drain]; -} - -static void delete_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] removeSelected]; - [pool drain]; -} - -static void select_all_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - TikzDocument *document = [window document]; - [[document pickSupport] selectAllNodes:[NSSet setWithArray:[[document graph] nodes]]]; - [pool drain]; -} - -static void deselect_all_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - TikzDocument *document = [window document]; - [[document pickSupport] deselectAllNodes]; - [[document pickSupport] deselectAllEdges]; - [pool drain]; -} - -static void flip_horiz_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] flipSelectedNodesHorizontally]; - [pool drain]; -} - -static void flip_vert_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] flipSelectedNodesVertically]; - [pool drain]; -} - -static void reverse_edges_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] reverseSelectedEdges]; - [pool drain]; -} - -static void bring_forward_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] bringSelectionForward]; - [pool drain]; -} - -static void send_backward_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] sendSelectionBackward]; - [pool drain]; -} - -static void bring_to_front_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] bringSelectionToFront]; - [pool drain]; -} - -static void send_to_back_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[window document] sendSelectionToBack]; - [pool drain]; -} - -#ifdef HAVE_POPPLER -static void show_preview_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window presentPreview]; - [pool drain]; -} -#endif - -static void zoom_in_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window zoomIn]; - [pool drain]; -} - -static void zoom_out_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window zoomOut]; - [pool drain]; -} - -static void zoom_reset_cb (GtkAction *action, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window zoomReset]; - [pool drain]; -} - -static void recent_chooser_item_activated_cb (GtkRecentChooser *chooser, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - gchar *uri, *path; - GError *error = NULL; - - uri = gtk_recent_chooser_get_current_uri (chooser); - - path = g_filename_from_uri (uri, NULL, NULL); - if (error) { - g_warning ("Could not convert uri \"%s\" to a local path: %s", uri, error->message); - g_error_free (error); - return; - } - - [window openFileAtPath:[NSString stringWithGlibFilename:path]]; - - g_free (uri); - g_free (path); - - [pool drain]; -} - - -static GtkActionEntry window_action_entries[] = { - /* - Fields: - * action name - * stock id or name of icon for action - * label for action (mark for translation with N_) - * accelerator (as understood by gtk_accelerator_parse()) - * tooltip (mark for translation with N_) - * callback - */ - { "FileMenu", NULL, N_("_File") }, - { "EditMenu", NULL, N_("_Edit") }, - { "ViewMenu", NULL, N_("_View") }, - { "HelpMenu", NULL, N_("_Help") }, - - { "Arrange", NULL, N_("_Arrange") }, - { "Zoom", NULL, N_("_Zoom") }, - - { "Open", GTK_STOCK_OPEN, N_("_Open\342\200\246") ,"<control>O", - N_("Open a graph"), G_CALLBACK (open_cb) }, - - { "Close", GTK_STOCK_CLOSE, NULL, "<control>W", - N_("Close the current graph"), G_CALLBACK (close_cb) }, - - { "ZoomIn", GTK_STOCK_ZOOM_IN, NULL, "<control>plus", - NULL, G_CALLBACK (zoom_in_cb) }, - - { "ZoomOut", GTK_STOCK_ZOOM_OUT, NULL, "<control>minus", - NULL, G_CALLBACK (zoom_out_cb) }, - - { "ZoomReset", GTK_STOCK_ZOOM_100, N_("_Reset zoom"), "<control>0", - NULL, G_CALLBACK (zoom_reset_cb) }, - - { "Save", GTK_STOCK_SAVE, NULL, "<control>S", - N_("Save the current graph"), G_CALLBACK (save_cb) }, - - { "SaveAs", GTK_STOCK_SAVE_AS, N_("Save _As\342\200\246"), NULL, - N_("Save the current graph with a different name"), G_CALLBACK (save_as_cb) }, - - { "SaveAsShape", NULL, N_("Save As S_hape\342\200\246"), NULL, - N_("Save the current graph as a shape for use in styles"), G_CALLBACK (save_as_shape_cb) }, - - { "Undo", GTK_STOCK_UNDO, NULL, "<control>Z", - N_("Undo the last action"), G_CALLBACK (undo_cb) }, - - { "Redo", GTK_STOCK_REDO, NULL, "<shift><control>Z", - N_("Redo the last action"), G_CALLBACK (redo_cb) }, - - { "Cut", GTK_STOCK_CUT, NULL, NULL, - N_("Cut the selection"), G_CALLBACK (cut_cb) }, - - { "Copy", GTK_STOCK_COPY, NULL, NULL, - N_("Copy the selection"), G_CALLBACK (copy_cb) }, - - { "Paste", GTK_STOCK_PASTE, NULL, NULL, - N_("Paste the clipboard"), G_CALLBACK (paste_cb) }, - - { "Delete", GTK_STOCK_DELETE, NULL, "Delete", - N_("Delete the selection"), G_CALLBACK (delete_cb) }, - - { "SelectAll", GTK_STOCK_SELECT_ALL, NULL, "<control>A", - N_("Select all nodes on the graph"), G_CALLBACK (select_all_cb) }, - - { "DeselectAll", NULL, N_("D_eselect all"), "<shift><control>A", - N_("Deselect everything"), G_CALLBACK (deselect_all_cb) }, - - { "FlipHoriz", NULL, N_("Flip nodes _horizonally"), NULL, - N_("Flip the selected nodes horizontally"), G_CALLBACK (flip_horiz_cb) }, - - { "FlipVert", NULL, N_("Flip nodes _vertically"), NULL, - N_("Flip the selected nodes vertically"), G_CALLBACK (flip_vert_cb) }, - - { "ReverseEdges", NULL, N_("Rever_se edges"), NULL, - N_("Reverse the selected edges"), G_CALLBACK (reverse_edges_cb) }, - - { "SendToBack", NULL, N_("Send to _back"), NULL, - N_("Send the selected nodes and edges to the back of the graph"), G_CALLBACK (send_to_back_cb) }, - - { "SendBackward", NULL, N_("Send b_ackward"), NULL, - N_("Send the selected nodes and edges backward"), G_CALLBACK (send_backward_cb) }, - - { "BringForward", NULL, N_("Bring f_orward"), NULL, - N_("Bring the selected nodes and edges forward"), G_CALLBACK (bring_forward_cb) }, - - { "BringToFront", NULL, N_("Bring to _front"), NULL, - N_("Bring the selected nodes and edges to the front of the graph"), G_CALLBACK (bring_to_front_cb) }, - - /* ViewMenu */ -#ifdef HAVE_POPPLER - { "ShowPreview", NULL, N_("_Preview"), "<control>L", - N_("See the graph as it will look when rendered in LaTeX"), G_CALLBACK (show_preview_cb) }, -#endif -}; -static guint n_window_action_entries = G_N_ELEMENTS (window_action_entries); - -// }}} -// {{{ UI XML - -static const gchar ui_info[] = -"<ui>" -" <menubar name='MenuBar'>" -" <menu action='FileMenu'>" -" <menuitem action='New'/>" -" <menuitem action='Open'/>" -" <menuitem action='OpenRecent'/>" -" <separator/>" -" <menuitem action='Save'/>" -" <menuitem action='SaveAs'/>" -" <separator/>" -" <menuitem action='SaveAsShape'/>" -" <menuitem action='RefreshShapes'/>" -" <separator/>" -" <menuitem action='Close'/>" -" <menuitem action='Quit'/>" -" </menu>" -" <menu action='EditMenu'>" -" <menu action='Tool'>" -" </menu>" -" <separator/>" -" <menuitem action='Undo'/>" -" <menuitem action='Redo'/>" -" <separator/>" -" <menuitem action='Cut'/>" -" <menuitem action='Copy'/>" -" <menuitem action='Paste'/>" -" <menuitem action='Delete'/>" -" <separator/>" -" <menuitem action='SelectAll'/>" -" <menuitem action='DeselectAll'/>" -" <separator/>" -" <menuitem action='FlipVert'/>" -" <menuitem action='FlipHoriz'/>" -" <menuitem action='ReverseEdges'/>" -" <separator/>" -" <menu action='Arrange'>" -" <menuitem action='SendToBack'/>" -" <menuitem action='SendBackward'/>" -" <menuitem action='BringForward'/>" -" <menuitem action='BringToFront'/>" -" </menu>" -" <separator/>" -" <menuitem action='ShowPreferences'/>" -" </menu>" -" <menu action='ViewMenu'>" -" <menuitem action='ShowContextWindow'/>" -#ifdef HAVE_POPPLER -" <menuitem action='ShowPreamble'/>" -" <menuitem action='ShowPreview'/>" -#endif -" <menu action='Zoom'>" -" <menuitem action='ZoomIn'/>" -" <menuitem action='ZoomOut'/>" -" <menuitem action='ZoomReset'/>" -" </menu>" -" </menu>" -" <menu action='HelpMenu'>" -" <menuitem action='HelpManual'/>" -" <separator/>" -" <menuitem action='About'/>" -" </menu>" -" </menubar>" -/* -" <toolbar name='ToolBar'>" -" <toolitem action='New'/>" -" <toolitem action='Open'/>" -" <toolitem action='Save'/>" -" <separator/>" -" <toolitem action='Cut'/>" -" <toolitem action='Copy'/>" -" <toolitem action='Paste'/>" -" <separator/>" -" <toolitem action='SelectMode'/>" -" <toolitem action='CreateNodeMode'/>" -" <toolitem action='DrawEdgeMode'/>" -" <toolitem action='BoundingBoxMode'/>" -" <toolitem action='HandMode'/>" -" </toolbar>" -*/ -"</ui>"; - - - -// }}} -// {{{ Helper methods - -static void configure_recent_chooser (GtkRecentChooser *chooser) -{ - gtk_recent_chooser_set_local_only (chooser, TRUE); - gtk_recent_chooser_set_show_icons (chooser, FALSE); - gtk_recent_chooser_set_sort_type (chooser, GTK_RECENT_SORT_MRU); - - GtkRecentFilter *filter = gtk_recent_filter_new (); - gtk_recent_filter_add_application (filter, g_get_application_name()); - gtk_recent_chooser_set_filter (chooser, filter); -} - -static void tool_cb (GtkAction *action, id<Tool> tool) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [app setActiveTool:tool]; - [pool drain]; -} - - - -// }}} -// {{{ API - -@implementation Menu - -- (id) init { - [self release]; - return nil; -} - -- (id) initForWindow:(Window*)window { - self = [super init]; - if (!self) { - return nil; - } - - GError *error = NULL; - - appActions = gtk_action_group_new ("TZApp"); - //gtk_action_group_set_translation_domain (actions, GETTEXT_PACKAGE); - gtk_action_group_add_actions (appActions, - app_action_entries, - n_app_action_entries, - app); - for (id<Tool> tool in [app tools]) { - NSString *tooltip = [NSString stringWithFormat: - @"%@: %@ (%@)", [tool name], [tool helpText], [tool shortcut]]; - GtkAction *action = gtk_action_new ( - [[tool name] UTF8String], - [[tool name] UTF8String], - [tooltip UTF8String], - [tool stockId]); - gtk_action_group_add_action_with_accel ( - appActions, - action, - NULL); - g_signal_connect ( - G_OBJECT (action), - "activate", - G_CALLBACK (tool_cb), - tool); - g_object_unref (action); - } - - windowActions = gtk_action_group_new ("TZWindow"); - //gtk_action_group_set_translation_domain (windowActions, GETTEXT_PACKAGE); - - gtk_action_group_add_actions (windowActions, - window_action_entries, - n_window_action_entries, - window); - - GtkAction *action = gtk_recent_action_new ("OpenRecent", N_("Open _Recent"), NULL, NULL); - g_signal_connect (G_OBJECT (action), - "item-activated", - G_CALLBACK (recent_chooser_item_activated_cb), - window); - configure_recent_chooser (GTK_RECENT_CHOOSER (action)); - gtk_action_group_add_action_with_accel (windowActions, action, NULL); - g_object_unref (action); - - /* Save refs to actions that will need to be updated */ - undoAction = gtk_action_group_get_action (windowActions, "Undo"); - redoAction = gtk_action_group_get_action (windowActions, "Redo"); - pasteAction = gtk_action_group_get_action (windowActions, "Paste"); - - nodeSelBasedActionCount = 4; - nodeSelBasedActions = g_new (GtkAction*, nodeSelBasedActionCount); - nodeSelBasedActions[0] = gtk_action_group_get_action (windowActions, "Cut"); - nodeSelBasedActions[1] = gtk_action_group_get_action (windowActions, "Copy"); - nodeSelBasedActions[2] = gtk_action_group_get_action (windowActions, "FlipHoriz"); - nodeSelBasedActions[3] = gtk_action_group_get_action (windowActions, "FlipVert"); - edgeSelBasedActionCount = 1; - edgeSelBasedActions = g_new (GtkAction*, edgeSelBasedActionCount); - edgeSelBasedActions[0] = gtk_action_group_get_action (windowActions, "ReverseEdges"); - selBasedActionCount = 2; - selBasedActions = g_new (GtkAction*, selBasedActionCount); - selBasedActions[0] = gtk_action_group_get_action (windowActions, "Delete"); - selBasedActions[1] = gtk_action_group_get_action (windowActions, "DeselectAll"); - - - GtkUIManager *ui = gtk_ui_manager_new (); - gtk_ui_manager_insert_action_group (ui, windowActions, 0); - gtk_ui_manager_insert_action_group (ui, appActions, 1); - gtk_window_add_accel_group ([window gtkWindow], gtk_ui_manager_get_accel_group (ui)); - if (!gtk_ui_manager_add_ui_from_string (ui, ui_info, -1, &error)) - { - g_message ("Building menus failed: %s", error->message); - g_error_free (error); - g_object_unref (ui); - [self release]; - return nil; - } - guint tool_merge_id = gtk_ui_manager_new_merge_id (ui); - for (id<Tool> tool in [app tools]) { - gtk_ui_manager_add_ui (ui, - tool_merge_id, - "/ui/MenuBar/EditMenu/Tool", - [[tool name] UTF8String], - [[tool name] UTF8String], - GTK_UI_MANAGER_AUTO, - FALSE); - } - menubar = gtk_ui_manager_get_widget (ui, "/MenuBar"); - g_object_ref_sink (menubar); - g_object_unref (ui); - - return self; -} - -- (void) dealloc { - g_free (nodeSelBasedActions); - g_free (edgeSelBasedActions); - g_free (selBasedActions); - g_object_unref (menubar); - g_object_unref (appActions); - g_object_unref (windowActions); - - [super dealloc]; -} - -@synthesize menubar; - -- (void) setUndoActionEnabled:(BOOL)enabled { - gtk_action_set_sensitive (undoAction, enabled); -} - -- (void) setUndoActionDetail:(NSString*)detail { - gtk_action_set_detailed_label (undoAction, "_Undo", [detail UTF8String]); -} - -- (void) setRedoActionEnabled:(BOOL)enabled { - gtk_action_set_sensitive (redoAction, enabled); -} - -- (void) setRedoActionDetail:(NSString*)detail { - gtk_action_set_detailed_label (redoAction, "_Redo", [detail UTF8String]); -} - -- (GtkAction*) pasteAction { - return pasteAction; -} - -- (void) notifySelectionChanged:(PickSupport*)pickSupport { - BOOL hasSelectedNodes = [[pickSupport selectedNodes] count] > 0; - BOOL hasSelectedEdges = [[pickSupport selectedEdges] count] > 0; - for (int i = 0; i < nodeSelBasedActionCount; ++i) { - if (nodeSelBasedActions[i]) { - gtk_action_set_sensitive (nodeSelBasedActions[i], hasSelectedNodes); - } - } - for (int i = 0; i < edgeSelBasedActionCount; ++i) { - if (edgeSelBasedActions[i]) { - gtk_action_set_sensitive (edgeSelBasedActions[i], hasSelectedEdges); - } - } - for (int i = 0; i < selBasedActionCount; ++i) { - if (selBasedActions[i]) { - gtk_action_set_sensitive (selBasedActions[i], hasSelectedNodes || hasSelectedEdges); - } - } -} - -@end - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NSError+Glib.h b/tikzit/src/gtk/NSError+Glib.h deleted file mode 100644 index 137977e..0000000 --- a/tikzit/src/gtk/NSError+Glib.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import <Foundation/Foundation.h> -#import <glib.h> - -@interface NSError(Glib) -+ (id) errorWithGError:(GError*)gerror; -@end - -void GErrorToNSError(GError *errorIn, NSError **errorOut); -void logGError (GError *error, NSString *message); - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NSError+Glib.m b/tikzit/src/gtk/NSError+Glib.m deleted file mode 100644 index f466d9e..0000000 --- a/tikzit/src/gtk/NSError+Glib.m +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NSError+Glib.h" -#import "TZFoundation.h" - -@implementation NSError(Glib) -+ (id) errorWithGError:(GError*)gerror { - if (!gerror) - return nil; - - NSString *message = [NSString stringWithUTF8String:gerror->message]; - NSString *domain = [NSString stringWithUTF8String:g_quark_to_string(gerror->domain)]; - - NSMutableDictionary *errorDetail = [NSMutableDictionary dictionaryWithObject:message - forKey:NSLocalizedDescriptionKey]; - return [self errorWithDomain:domain code:gerror->code userInfo:errorDetail]; -} -@end - -void GErrorToNSError(GError *errorIn, NSError **errorOut) -{ - if (errorOut && errorIn) { - *errorOut = [NSError errorWithGError:errorIn]; - } -} - -void logGError (GError *error, NSString *message) { - if (message == nil) { - NSLog (@"%s", error->message); - } else { - NSLog (@"%@: %s", message, error->message); - } -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NSFileManager+Glib.h b/tikzit/src/gtk/NSFileManager+Glib.h deleted file mode 100644 index cb49fcb..0000000 --- a/tikzit/src/gtk/NSFileManager+Glib.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import <Foundation/Foundation.h> - -@interface NSFileManager(Glib) -/** - * Creates a directory in the system temp directory - */ -- (NSString*) createTempDirectoryWithError:(NSError**)error; -/** - * Creates a directory in the system temp directory - */ -- (NSString*) createTempDirectory; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NSFileManager+Glib.m b/tikzit/src/gtk/NSFileManager+Glib.m deleted file mode 100644 index b3e9de6..0000000 --- a/tikzit/src/gtk/NSFileManager+Glib.m +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NSFileManager+Glib.h" -#import "TZFoundation.h" -#import "mkdtemp.h" - -@implementation NSFileManager(Glib) - -- (NSString*) createTempDirectoryWithError:(NSError**)error { - NSString *result = nil; -#if GLIB_CHECK_VERSION (2, 30, 0) - GError *gerror = NULL; - gchar *dir = g_dir_make_tmp ("tikzitXXXXXX", &gerror); - GErrorToNSError (gerror, error); - if (dir) - result = [NSString stringWithGlibFilename:dir]; - g_free (dir); -#else -//#if (!GLIB_CHECK_VERSION (2, 26, 0)) -#define g_mkdtemp mkdtemp -//#endif - gchar *dir = g_build_filename (g_get_tmp_dir(), "tikzitXXXXXX", NULL); - gchar *rdir = g_mkdtemp (dir); - if (rdir) { - result = [NSString stringWithGlibFilename:dir]; - } else if (error) { - *error = [NSError errorWithLibcError:errno]; - } - g_free (dir); -#endif - return result; -} - -- (NSString*) createTempDirectory { - return [self createTempDirectoryWithError:NULL]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NSString+Glib.h b/tikzit/src/gtk/NSString+Glib.h deleted file mode 100644 index ac59833..0000000 --- a/tikzit/src/gtk/NSString+Glib.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import <Foundation/Foundation.h> -#import <glib.h> - -@interface NSString(Glib) -/** - * Initialise a string with a string in the GLib filename encoding - */ -- (id) initWithGlibFilename:(const gchar *)filename; -/** - * Create a string from a string in the GLib filename encoding - */ -+ (id) stringWithGlibFilename:(const gchar *)filename; -/** - * Get a copy of the string in GLib filename encoding. - * - * This will need to be freed with g_free. - */ -- (gchar*)glibFilename; -/** - * Get a copy of the string as a GLib URI - * - * This will need to be freed with g_free. - */ -- (gchar*)glibUriWithError:(NSError**)error; -/** - * Get a copy of the string as a GLib URI - * - * This will need to be freed with g_free. - */ -- (gchar*)glibUri; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NSString+Glib.m b/tikzit/src/gtk/NSString+Glib.m deleted file mode 100644 index b6dc765..0000000 --- a/tikzit/src/gtk/NSString+Glib.m +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NSString+Glib.h" -#import "TZFoundation.h" - -@implementation NSString(Glib) -+ (id) stringWithGlibFilename:(const gchar *)filename { - return [[[self alloc] initWithGlibFilename:filename] autorelease]; -} - -- (id) initWithGlibFilename:(const gchar *)filename { - if (self == nil) { - return nil; - } - - if (filename == NULL) { - [self release]; - return nil; - } - - GError *error = NULL; - gchar *utf8file = g_filename_to_utf8 (filename, -1, NULL, NULL, &error); - if (utf8file == NULL) { - if (error) - logGError (error, @"Failed to convert a GLib filename to UTF8"); - [self release]; - return nil; - } - - self = [self initWithUTF8String:utf8file]; - g_free (utf8file); - - return self; -} - -- (gchar*)glibFilenameWithError:(NSError**)error { - GError *gerror = NULL; - gchar *result = g_filename_from_utf8 ([self UTF8String], -1, NULL, NULL, &gerror); - GErrorToNSError (gerror, error); - if (gerror) { - logGError (gerror, @"Failed to convert a UTF8 string to a GLib filename"); - } - return result; -} - -- (gchar*)glibFilename { - return [self glibFilenameWithError:NULL]; -} - -- (gchar*)glibUriWithError:(NSError**)error { - gchar *filepath; - gchar *uri; - NSError *cause = nil; - - filepath = [self glibFilenameWithError:&cause]; - if (!filepath) { - if (error) { - NSString *message = [NSString stringWithFormat:@"Could not convert \"%@\" to the GLib filename encoding", self]; - *error = [NSError errorWithMessage:message code:TZ_ERR_OTHER cause:cause]; - } - return NULL; - } - - GError *gerror = NULL; - GError **gerrorptr = error ? &gerror : NULL; - uri = g_filename_to_uri (filepath, NULL, gerrorptr); - if (!uri && error) { - NSString *message = [NSString stringWithFormat:@"Could not convert \"%@\" to a GLib URI", self]; - *error = [NSError errorWithMessage:message code:TZ_ERR_BADFORMAT cause:[NSError errorWithGError:gerror]]; - } - g_free (filepath); - return uri; -} - -- (gchar*)glibUri { - return [self glibUriWithError:NULL]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Node+Render.h b/tikzit/src/gtk/Node+Render.h deleted file mode 100644 index 60d2573..0000000 --- a/tikzit/src/gtk/Node+Render.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Node.h" -#import "RenderContext.h" -#import "Surface.h" - -enum NodeState { - NodeNormal, - NodeSelected, - NodeHighlighted -}; - -@interface Node(Render) - -- (Transformer*) shapeTransformerForSurface:(id<Surface>)surface; -// the total rendered bounds, excluding label -- (NSRect) renderBoundsForSurface:(id<Surface>)surface; -- (NSRect) renderBoundsWithLabelForSurface:(id<Surface>)surface; -- (NSString*) renderedLabel; -- (NSSize) renderedLabelSizeInContext:(id<RenderContext>)context; -- (void) renderLabelToSurface:(id<Surface>)surface withContext:(id<RenderContext>)context; -- (void) renderLabelAt:(NSPoint)point withContext:(id<RenderContext>)context; -- (void) renderToSurface:(id<Surface>)surface withContext:(id<RenderContext>)context state:(enum NodeState)state; -- (BOOL) hitByPoint:(NSPoint)p onSurface:(id<Surface>)surface; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Node+Render.m b/tikzit/src/gtk/Node+Render.m deleted file mode 100644 index 907d818..0000000 --- a/tikzit/src/gtk/Node+Render.m +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Node+Render.h" -#import "Shape.h" -#import "Shape+Render.h" -#import "ShapeNames.h" - -#define MAX_LABEL_LENGTH 10 -#define LABEL_PADDING_X 2 -#define LABEL_PADDING_Y 2 - -@implementation Node (Render) - -- (Shape*) shapeToRender { - if (style) { - return [Shape shapeForName:[style shapeName]]; - } else { - return [Shape shapeForName:SHAPE_CIRCLE]; - } -} - -- (Transformer*) shapeTransformerForSurface:(id<Surface>)surface { - return [self shapeTransformerFromTransformer:[surface transformer]]; -} - -- (NSRect) renderBoundsUsingShapeTransform:(Transformer*)shapeTrans { - float strokeThickness = style ? [style strokeThickness] : [NodeStyle defaultStrokeThickness]; - NSRect screenBounds = [shapeTrans rectToScreen:[[self shapeToRender] boundingRect]]; - screenBounds = NSInsetRect(screenBounds, -strokeThickness, -strokeThickness); - return screenBounds; -} - -- (NSRect) renderBoundsForSurface:(id<Surface>)surface { - return [self renderBoundsUsingShapeTransform:[self shapeTransformerForSurface:surface]]; -} - -- (NSRect) renderBoundsWithLabelForSurface:(id<Surface>)surface { - NSRect nodeBounds = [self renderBoundsForSurface:surface]; - NSRect labelRect = NSZeroRect; - if (![label isEqual:@""]) { - id<RenderContext> cr = [surface createRenderContext]; - labelRect.size = [self renderedLabelSizeInContext:cr]; - NSPoint nodePos = [[surface transformer] toScreen:point]; - labelRect.origin.x = nodePos.x - (labelRect.size.width / 2); - labelRect.origin.y = nodePos.y - (labelRect.size.height / 2); - } - return NSUnionRect(nodeBounds, labelRect); -} - -- (RColor) strokeColor { - if (style) { - return [[style strokeColorRGB] rColor]; - } else { - return MakeRColor (0.4, 0.4, 0.7, 0.8); - } -} - -- (RColor) fillColor { - if (style) { - return [[style fillColorRGB] rColor]; - } else { - return MakeRColor (0.4, 0.4, 0.7, 0.3); - } -} - -- (NSString*) renderedLabel { - NSString *r_label = [label stringByExpandingLatexConstants]; - if ([r_label length] > MAX_LABEL_LENGTH) { - r_label = [[[r_label substringToIndex:MAX_LABEL_LENGTH-1] stringByTrimmingSpaces] stringByAppendingString:@"..."]; - } else { - r_label = [r_label stringByTrimmingSpaces]; - } - return r_label; -} - -- (NSSize) renderedLabelSizeInContext:(id<RenderContext>)context { - NSSize result = {0, 0}; - if (![label isEqual:@""]) { - NSString *r_label = [self renderedLabel]; - - id<TextLayout> layout = [context layoutText:r_label withSize:9]; - - result = [layout size]; - result.width += LABEL_PADDING_X; - result.height += LABEL_PADDING_Y; - } - return result; -} - -- (void) renderLabelToSurface:(id <Surface>)surface withContext:(id<RenderContext>)context { - [self renderLabelAt:[[surface transformer] toScreen:point] withContext:context]; -} - -- (void) renderLabelAt:(NSPoint)p withContext:(id<RenderContext>)context { - // draw latex code overlayed on node - if (![label isEqual:@""]) { - [context saveState]; - - NSString *r_label = [self renderedLabel]; - id<TextLayout> layout = [context layoutText:r_label withSize:9]; - - NSSize labelSize = [layout size]; - - NSRect textBounds = NSMakeRect (p.x - labelSize.width/2, - p.y - labelSize.height/2, - labelSize.width, - labelSize.height); - NSRect backRect = NSInsetRect (textBounds, -LABEL_PADDING_X, -LABEL_PADDING_Y); - - [context startPath]; - [context setLineWidth:1.0]; - [context rect:backRect]; - RColor fColor = MakeRColor (1.0, 1.0, 0.5, 0.7); - RColor sColor = MakeRColor (0.5, 0.0, 0.0, 0.7); - [context strokePathWithColor:sColor andFillWithColor:fColor]; - - [layout showTextAt:textBounds.origin withColor:BlackRColor]; - - [context restoreState]; - } -} - -- (void) renderToSurface:(id <Surface>)surface withContext:(id<RenderContext>)context state:(enum NodeState)state { - Transformer *shapeTrans = [self shapeTransformerForSurface:surface]; - float strokeThickness = style ? [style strokeThickness] : [NodeStyle defaultStrokeThickness]; - - [context saveState]; - - [[self shapeToRender] drawPathWithTransform:shapeTrans andContext:context]; - - [context setLineWidth:strokeThickness]; - if (!style) { - [context setLineDash:3.0]; - } - [context strokePathWithColor:[self strokeColor] andFillWithColor:[self fillColor]]; - - if (state != NodeNormal) { - [context setLineWidth:strokeThickness + 4.0]; - [context setLineDash:0.0]; - float alpha = 0.0f; - if (state == NodeSelected) - alpha = 0.5f; - else if (state == NodeHighlighted) - alpha = 0.25f; - RColor selectionColor = MakeSolidRColor(0.61f, 0.735f, 1.0f); - - [[self shapeToRender] drawPathWithTransform:shapeTrans andContext:context]; - [context strokePathWithColor:selectionColor andFillWithColor:selectionColor usingAlpha:alpha]; - } - - [context restoreState]; - [self renderLabelToSurface:surface withContext:context]; -} - -- (BOOL) hitByPoint:(NSPoint)p onSurface:(id<Surface>)surface { - Transformer *shapeTrans = [self shapeTransformerForSurface:surface]; - - NSRect screenBounds = [self renderBoundsUsingShapeTransform:shapeTrans]; - if (!NSPointInRect(p, screenBounds)) { - return NO; - } - - float strokeThickness = style ? [style strokeThickness] : [NodeStyle defaultStrokeThickness]; - id<RenderContext> ctx = [surface createRenderContext]; - [ctx setLineWidth:strokeThickness]; - [[self shapeToRender] drawPathWithTransform:shapeTrans andContext:ctx]; - return [ctx strokeIncludesPoint:p] || [ctx fillIncludesPoint:p]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyle+Gtk.h b/tikzit/src/gtk/NodeStyle+Gtk.h deleted file mode 100644 index 4fa5edd..0000000 --- a/tikzit/src/gtk/NodeStyle+Gtk.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "NodeStyle.h" -#import <gtk/gtk.h> - -@interface NodeStyle (Gtk) - -- (GdkColor) strokeColor; -- (void) setStrokeColor:(GdkColor)color; -- (GdkColor) fillColor; -- (void) setFillColor:(GdkColor)color; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyle+Gtk.m b/tikzit/src/gtk/NodeStyle+Gtk.m deleted file mode 100644 index 1954def..0000000 --- a/tikzit/src/gtk/NodeStyle+Gtk.m +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStyle+Gtk.h" -#import "ColorRGB+Gtk.h" - -@implementation NodeStyle (Gtk) - -- (GdkColor) strokeColor { - return [[self strokeColorRGB] gdkColor]; -} - -- (void) setStrokeColor:(GdkColor)color { - [self setStrokeColorRGB:[ColorRGB colorWithGdkColor:color]]; -} - -- (GdkColor) fillColor { - return [[self fillColorRGB] gdkColor]; -} - -- (void) setFillColor:(GdkColor)color { - [self setFillColorRGB:[ColorRGB colorWithGdkColor:color]]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyle+Render.h b/tikzit/src/gtk/NodeStyle+Render.h deleted file mode 100644 index 00edd27..0000000 --- a/tikzit/src/gtk/NodeStyle+Render.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "NodeStyle.h" -#import "RenderContext.h" -#import "Surface.h" - -@interface NodeStyle (Render) - -- (void) renderToSurface:(id<Surface>)surface withContext:(id<RenderContext>)context at:(NSPoint)p; -- (BOOL) hitByPoint:(NSPoint)p onSurface:(id<Surface>)surface; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyle+Storage.h b/tikzit/src/gtk/NodeStyle+Storage.h deleted file mode 100644 index 7649414..0000000 --- a/tikzit/src/gtk/NodeStyle+Storage.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "NodeStyle.h" -#import "Configuration.h" - -@interface NodeStyle (Storage) - -- (id) initFromConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile; -- (void) storeToConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyle+Storage.m b/tikzit/src/gtk/NodeStyle+Storage.m deleted file mode 100644 index 088b062..0000000 --- a/tikzit/src/gtk/NodeStyle+Storage.m +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * Copyright 2010 Chris Heunen - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStyle+Storage.h" -#import "ColorRGB+IntegerListStorage.h" - -@implementation NodeStyle (Storage) - -- (id) initFromConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile { - self = [self init]; - - if (self) { - [self setName:[configFile stringEntry:@"Name" inGroup:groupName withDefault:name]]; - [self setCategory:[configFile stringEntry:@"Category" inGroup:groupName withDefault:category]]; - [self setShapeName:[configFile stringEntry:@"ShapeName" inGroup:groupName withDefault:shapeName]]; - [self setScale:[configFile doubleEntry:@"Scale" inGroup:groupName withDefault:scale]]; - [self setStrokeThickness:[configFile integerEntry:@"StrokeThickness" - inGroup:groupName - withDefault:strokeThickness]]; - [self setStrokeColorRGB: - [ColorRGB colorFromValueList: - [configFile integerListEntry:@"StrokeColor" - inGroup:groupName - withDefault:[strokeColorRGB valueList]]]]; - [self setFillColorRGB: - [ColorRGB colorFromValueList: - [configFile integerListEntry:@"FillColor" - inGroup:groupName - withDefault:[fillColorRGB valueList]]]]; - } - - return self; -} - -- (void) storeToConfigurationGroup:(NSString*)groupName config:(Configuration*)configFile { - [configFile setStringEntry:@"Name" inGroup:groupName value:[self name]]; - [configFile setStringEntry:@"Category" inGroup:groupName value:[self category]]; - [configFile setStringEntry:@"ShapeName" inGroup:groupName value:[self shapeName]]; - [configFile setDoubleEntry:@"Scale" inGroup:groupName value:[self scale]]; - [configFile setIntegerEntry:@"StrokeThickness" inGroup:groupName value:[self strokeThickness]]; - [configFile setIntegerListEntry:@"StrokeColor" inGroup:groupName value:[[self strokeColorRGB] valueList]]; - [configFile setIntegerListEntry:@"FillColor" inGroup:groupName value:[[self fillColorRGB] valueList]]; -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyleEditor.h b/tikzit/src/gtk/NodeStyleEditor.h deleted file mode 100644 index b45c992..0000000 --- a/tikzit/src/gtk/NodeStyleEditor.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class NodeStyle; - -@interface NodeStyleEditor: NSObject { - NodeStyle *style; - GtkTable *table; - GtkEntry *nameEdit; - GtkComboBox *shapeNameCombo; - GtkColorButton *strokeColorButton; - GtkWidget *makeStrokeTexSafeButton; - GtkColorButton *fillColorButton; - GtkWidget *makeFillTexSafeButton; - GtkAdjustment *scaleAdj; - BOOL blockSignals; -} - -@property (retain) NodeStyle *style; -@property (readonly) GtkWidget *widget; - -- (id) init; - -- (void) selectNameField; - -@end - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NodeStyleEditor.m b/tikzit/src/gtk/NodeStyleEditor.m deleted file mode 100644 index fcf4147..0000000 --- a/tikzit/src/gtk/NodeStyleEditor.m +++ /dev/null @@ -1,477 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStyleEditor.h" -#import "NodeStyle.h" -#import "NodeStyle+Gtk.h" -#import "Shape.h" - -static const guint row_count = 5; - -// {{{ Internal interfaces -// {{{ GTK+ Callbacks -static void style_name_edit_changed_cb (GtkEditable *widget, NodeStyleEditor *editor); -static void style_shape_combo_changed_cb (GtkComboBox *widget, NodeStyleEditor *editor); -static void stroke_color_changed_cb (GtkColorButton *widget, NodeStyleEditor *editor); -static void fill_color_changed_cb (GtkColorButton *widget, NodeStyleEditor *editor); -static void make_stroke_safe_button_clicked_cb (GtkButton *widget, NodeStyleEditor *editor); -static void make_fill_safe_button_clicked_cb (GtkButton *widget, NodeStyleEditor *editor); -static void scale_adjustment_changed_cb (GtkAdjustment *widget, NodeStyleEditor *editor); -// }}} -// {{{ Notifications - -@interface NodeStyleEditor (Notifications) -- (void) shapeDictionaryReplaced:(NSNotification*)n; -- (void) nameChangedTo:(NSString*)value; -- (void) shapeNameChangedTo:(NSString*)value; -- (void) strokeColorChangedTo:(GdkColor)value; -- (void) makeStrokeColorTexSafe; -- (void) fillColorChangedTo:(GdkColor)value; -- (void) makeFillColorTexSafe; -- (void) scaleChangedTo:(double)value; -@end - -// }}} -// {{{ Private - -@interface NodeStyleEditor (Private) -- (void) loadShapeNames; -- (void) setActiveShapeName:(NSString*)name; -@end - -// }}} -// }}} -// {{{ API - -@implementation NodeStyleEditor - -- (void) _addWidget:(GtkWidget*)w withLabel:(gchar *)label atRow:(guint)row { - NSAssert(row < row_count, @"row_count is wrong!"); - - GtkWidget *l = gtk_label_new (label); - gtk_misc_set_alignment (GTK_MISC (l), 0, 0.5); - gtk_widget_show (l); - gtk_widget_show (w); - - gtk_table_attach (table, l, - 0, 1, row, row+1, // l, r, t, b - GTK_FILL, // x opts - GTK_FILL | GTK_EXPAND, // y opts - 5, // x padding - 0); // y padding - - gtk_table_attach (table, w, - 1, 2, row, row+1, // l, r, t, b - GTK_FILL | GTK_EXPAND, // x opts - GTK_FILL | GTK_EXPAND, // y opts - 0, // x padding - 0); // y padding -} - -- (GtkWidget*) _createMakeColorTexSafeButton:(NSString*)type { - GtkWidget *b = gtk_button_new (); - GtkWidget *icon = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); - gtk_widget_show (icon); - gtk_container_add (GTK_CONTAINER (b), icon); - NSString *ttip = [NSString stringWithFormat:@"The %@ colour is not a predefined TeX colour.\nClick here to choose the nearest TeX-safe colour.", type]; - gtk_widget_set_tooltip_text (b, [ttip UTF8String]); - return b; -} - -- (id) init { - self = [super init]; - - if (self != nil) { - style = nil; - table = GTK_TABLE (gtk_table_new (row_count, 2, FALSE)); - gtk_table_set_col_spacings (table, 6); - gtk_table_set_row_spacings (table, 6); - gtk_widget_set_sensitive (GTK_WIDGET (table), FALSE); - blockSignals = NO; - - /** - * Name - */ - nameEdit = GTK_ENTRY (gtk_entry_new ()); - g_object_ref_sink (nameEdit); - [self _addWidget:GTK_WIDGET (nameEdit) - withLabel:"Name" - atRow:0]; - g_signal_connect (G_OBJECT (nameEdit), - "changed", - G_CALLBACK (style_name_edit_changed_cb), - self); - - - /** - * Shape - */ - GtkListStore *store = gtk_list_store_new (1, G_TYPE_STRING); - shapeNameCombo = GTK_COMBO_BOX (gtk_combo_box_new_with_model (GTK_TREE_MODEL (store))); - GtkCellRenderer *cellRend = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (shapeNameCombo), - cellRend, - TRUE); - gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (shapeNameCombo), cellRend, "text", 0); - g_object_ref_sink (shapeNameCombo); - [self _addWidget:GTK_WIDGET (shapeNameCombo) - withLabel:"Shape" - atRow:1]; - g_signal_connect (G_OBJECT (shapeNameCombo), - "changed", - G_CALLBACK (style_shape_combo_changed_cb), - self); - - - /** - * Stroke colour - */ - GtkWidget *strokeBox = gtk_hbox_new (FALSE, 0); - [self _addWidget:strokeBox - withLabel:"Stroke colour" - atRow:2]; - strokeColorButton = GTK_COLOR_BUTTON (gtk_color_button_new ()); - g_object_ref_sink (strokeColorButton); - gtk_widget_show (GTK_WIDGET (strokeColorButton)); - gtk_box_pack_start (GTK_BOX (strokeBox), GTK_WIDGET (strokeColorButton), - FALSE, FALSE, 0); - makeStrokeTexSafeButton = [self _createMakeColorTexSafeButton:@"stroke"]; - g_object_ref_sink (makeStrokeTexSafeButton); - gtk_box_pack_start (GTK_BOX (strokeBox), makeStrokeTexSafeButton, - FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (strokeColorButton), - "color-set", - G_CALLBACK (stroke_color_changed_cb), - self); - g_signal_connect (G_OBJECT (makeStrokeTexSafeButton), - "clicked", - G_CALLBACK (make_stroke_safe_button_clicked_cb), - self); - - - /** - * Fill colour - */ - GtkWidget *fillBox = gtk_hbox_new (FALSE, 0); - [self _addWidget:fillBox - withLabel:"Fill colour" - atRow:3]; - fillColorButton = GTK_COLOR_BUTTON (gtk_color_button_new ()); - g_object_ref_sink (fillColorButton); - gtk_widget_show (GTK_WIDGET (fillColorButton)); - gtk_box_pack_start (GTK_BOX (fillBox), GTK_WIDGET (fillColorButton), - FALSE, FALSE, 0); - makeFillTexSafeButton = [self _createMakeColorTexSafeButton:@"fill"]; - g_object_ref_sink (makeFillTexSafeButton); - gtk_box_pack_start (GTK_BOX (fillBox), makeFillTexSafeButton, - FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (fillColorButton), - "color-set", - G_CALLBACK (fill_color_changed_cb), - self); - g_signal_connect (G_OBJECT (makeFillTexSafeButton), - "clicked", - G_CALLBACK (make_fill_safe_button_clicked_cb), - self); - - - /** - * Scale - */ - scaleAdj = GTK_ADJUSTMENT (gtk_adjustment_new ( - 1.0, // value - 0.0, // lower - 50.0, // upper - 0.20, // step - 1.0, // page - 0.0)); // (irrelevant) - g_object_ref_sink (scaleAdj); - GtkWidget *scaleSpin = gtk_spin_button_new (scaleAdj, 0.0, 2); - [self _addWidget:scaleSpin - withLabel:"Scale" - atRow:4]; - g_signal_connect (G_OBJECT (scaleAdj), - "value-changed", - G_CALLBACK (scale_adjustment_changed_cb), - self); - - [self loadShapeNames]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(shapeDictionaryReplaced:) - name:@"ShapeDictionaryReplaced" - object:[Shape class]]; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (nameEdit); - g_object_unref (shapeNameCombo); - g_object_unref (strokeColorButton); - g_object_unref (makeStrokeTexSafeButton); - g_object_unref (fillColorButton); - g_object_unref (makeFillTexSafeButton); - g_object_unref (scaleAdj); - g_object_unref (table); - [style release]; - - [super dealloc]; -} - -- (NodeStyle*) style { - return style; -} - -- (void) setStyle:(NodeStyle*)s { - blockSignals = YES; - NodeStyle *oldStyle = style; - style = [s retain]; - - if (style != nil) { - gtk_widget_set_sensitive (GTK_WIDGET (table), TRUE); - - gtk_entry_set_text(nameEdit, [[style name] UTF8String]); - - [self setActiveShapeName:[style shapeName]]; - - GdkColor c = [style strokeColor]; - gtk_color_button_set_color(strokeColorButton, &c); - - gtk_widget_set_visible (makeStrokeTexSafeButton, ([[style strokeColorRGB] name] == nil)); - - c = [style fillColor]; - gtk_color_button_set_color(fillColorButton, &c); - - gtk_widget_set_visible (makeFillTexSafeButton, ([[style fillColorRGB] name] == nil)); - - gtk_adjustment_set_value(scaleAdj, [style scale]); - } else { - gtk_entry_set_text(nameEdit, ""); - [self setActiveShapeName:nil]; - gtk_widget_set_visible (makeStrokeTexSafeButton, FALSE); - gtk_widget_set_visible (makeFillTexSafeButton, FALSE); - gtk_adjustment_set_value(scaleAdj, 1.0); - gtk_widget_set_sensitive (GTK_WIDGET (table), FALSE); - } - - [oldStyle release]; - blockSignals = NO; -} - -- (GtkWidget*) widget { - return GTK_WIDGET (table); -} - -- (void) selectNameField { - gtk_widget_grab_focus (GTK_WIDGET (nameEdit)); - gtk_editable_select_region (GTK_EDITABLE (nameEdit), 0, -1); -} - -@end - -// }}} -// {{{ Notifications - -@implementation NodeStyleEditor (Notifications) -- (void) shapeDictionaryReplaced:(NSNotification*)n { - blockSignals = YES; - - [self loadShapeNames]; - [self setActiveShapeName:[style shapeName]]; - - blockSignals = NO; -} - -- (void) nameChangedTo:(NSString*)value { - [style setName:value]; -} - -- (void) shapeNameChangedTo:(NSString*)value { - [style setShapeName:value]; -} - -- (void) strokeColorChangedTo:(GdkColor)value { - [style setStrokeColor:value]; - gtk_widget_set_visible (makeStrokeTexSafeButton, - [[style strokeColorRGB] name] == nil); -} - -- (void) makeStrokeColorTexSafe { - if (style != nil) { - [[style strokeColorRGB] setToClosestHashed]; - GdkColor color = [style strokeColor]; - gtk_color_button_set_color(strokeColorButton, &color); - gtk_widget_set_visible (makeStrokeTexSafeButton, FALSE); - } -} - -- (void) fillColorChangedTo:(GdkColor)value { - [style setFillColor:value]; - gtk_widget_set_visible (makeFillTexSafeButton, - [[style fillColorRGB] name] == nil); -} - -- (void) makeFillColorTexSafe { - if (style != nil) { - [[style fillColorRGB] setToClosestHashed]; - GdkColor color = [style fillColor]; - gtk_color_button_set_color(fillColorButton, &color); - gtk_widget_set_visible (makeFillTexSafeButton, FALSE); - } -} - -- (void) scaleChangedTo:(double)value { - [style setScale:value]; -} -@end - -// }}} -// {{{ Private - -@implementation NodeStyleEditor (Private) -- (BOOL) signalsBlocked { return blockSignals; } - -- (void) loadShapeNames { - blockSignals = YES; - - gtk_combo_box_set_active (shapeNameCombo, -1); - - GtkListStore *list = GTK_LIST_STORE (gtk_combo_box_get_model (shapeNameCombo)); - gtk_list_store_clear (list); - - NSEnumerator *en = [[Shape shapeDictionary] keyEnumerator]; - NSString *shapeName; - GtkTreeIter iter; - while ((shapeName = [en nextObject]) != nil) { - gtk_list_store_append (list, &iter); - gtk_list_store_set (list, &iter, 0, [shapeName UTF8String], -1); - } - - blockSignals = NO; -} - -- (void) setActiveShapeName:(NSString*)name { - if (name == nil) { - gtk_combo_box_set_active (shapeNameCombo, -1); - return; - } - const gchar *shapeName = [name UTF8String]; - - GtkTreeModel *model = gtk_combo_box_get_model (shapeNameCombo); - GtkTreeIter iter; - if (gtk_tree_model_get_iter_first (model, &iter)) { - do { - gchar *rowShapeName; - gtk_tree_model_get (model, &iter, 0, &rowShapeName, -1); - if (g_strcmp0 (shapeName, rowShapeName) == 0) { - gtk_combo_box_set_active_iter (shapeNameCombo, &iter); - g_free (rowShapeName); - return; - } - g_free (rowShapeName); - } while (gtk_tree_model_iter_next (model, &iter)); - } -} -@end - -// }}} -// {{{ GTK+ callbacks - -static void style_name_edit_changed_cb (GtkEditable *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - const gchar *contents = gtk_entry_get_text (GTK_ENTRY (widget)); - [editor nameChangedTo:[NSString stringWithUTF8String:contents]]; - - [pool drain]; -} - -static void style_shape_combo_changed_cb (GtkComboBox *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GtkTreeIter iter; - gtk_combo_box_get_active_iter (widget, &iter); - gchar *shapeName = NULL; - gtk_tree_model_get (gtk_combo_box_get_model (widget), &iter, 0, &shapeName, -1); - [editor shapeNameChangedTo:[NSString stringWithUTF8String:shapeName]]; - g_free (shapeName); - - [pool drain]; -} - -static void stroke_color_changed_cb (GtkColorButton *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GdkColor color; - gtk_color_button_get_color (widget, &color); - [editor strokeColorChangedTo:color]; - - [pool drain]; -} - -static void fill_color_changed_cb (GtkColorButton *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - GdkColor color; - gtk_color_button_get_color (widget, &color); - [editor fillColorChangedTo:color]; - - [pool drain]; -} - -static void make_stroke_safe_button_clicked_cb (GtkButton *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor makeStrokeColorTexSafe]; - [pool drain]; -} - -static void make_fill_safe_button_clicked_cb (GtkButton *widget, NodeStyleEditor *editor) { - if ([editor signalsBlocked]) - return; - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor makeFillColorTexSafe]; - [pool drain]; -} - -static void scale_adjustment_changed_cb (GtkAdjustment *adj, NodeStyleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor scaleChangedTo:gtk_adjustment_get_value (adj)]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NodeStyleSelector.h b/tikzit/src/gtk/NodeStyleSelector.h deleted file mode 100644 index a699dc8..0000000 --- a/tikzit/src/gtk/NodeStyleSelector.h +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class NodeStyle; -@class NodeStylesModel; -@class StyleManager; - -@interface NodeStyleSelector: NSObject { - NodeStylesModel *model; - GtkIconView *view; -} - -/*! - @property widget - @brief The GTK widget - */ -@property (readonly) GtkWidget *widget; - -/*! - @property model - @brief The model to use. - */ -@property (retain) NodeStylesModel *model; - -/*! - @property selectedStyle - @brief The selected style. - - When this changes, a SelectedStyleChanged notification will be posted - */ -@property (assign) NodeStyle *selectedStyle; - -/*! - * Initialise with a new model for the given style manager - */ -- (id) initWithStyleManager:(StyleManager*)manager; -/*! - * Initialise with the given model - */ -- (id) initWithModel:(NodeStylesModel*)model; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStyleSelector.m b/tikzit/src/gtk/NodeStyleSelector.m deleted file mode 100644 index 14cdc75..0000000 --- a/tikzit/src/gtk/NodeStyleSelector.m +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStyleSelector.h" - -#import "NodeStylesModel.h" - -// {{{ Internal interfaces -static void selection_changed_cb (GtkIconView *widget, NodeStyleSelector *mgr); -// }}} -// {{{ API - -@implementation NodeStyleSelector - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)m { - return [self initWithModel:[NodeStylesModel modelWithStyleManager:m]]; -} -- (id) initWithModel:(NodeStylesModel*)m { - self = [super init]; - - if (self) { - model = [m retain]; - - view = GTK_ICON_VIEW (gtk_icon_view_new ()); - g_object_ref_sink (view); - - gtk_icon_view_set_model (view, [model model]); - gtk_icon_view_set_pixbuf_column (view, NODE_STYLES_ICON_COL); - gtk_icon_view_set_tooltip_column (view, NODE_STYLES_NAME_COL); - gtk_icon_view_set_selection_mode (view, GTK_SELECTION_SINGLE); - - g_signal_connect (G_OBJECT (view), - "selection-changed", - G_CALLBACK (selection_changed_cb), - self); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (view); - [model release]; - - [super dealloc]; -} - -- (NodeStylesModel*) model { - return model; -} - -- (void) setModel:(NodeStylesModel*)m { - if (m == model) - return; - - NodeStylesModel *oldModel = model; - model = [m retain]; - gtk_icon_view_set_model (view, [model model]); - [oldModel release]; -} - -- (GtkWidget*) widget { - return GTK_WIDGET (view); -} - -- (NodeStyle*) selectedStyle { - GList *list = gtk_icon_view_get_selected_items (view); - if (!list) { - return nil; - } - if (list->next != NULL) { - NSLog(@"Multiple selected items in NodeStyleSelector!"); - } - - GtkTreePath *path = (GtkTreePath*) list->data; - NodeStyle *style = [model styleFromPath:path]; - - g_list_foreach (list, (GFunc)gtk_tree_path_free, NULL); - g_list_free (list); - - return style; -} - -- (void) setSelectedStyle:(NodeStyle*)style { - if (style == nil) { - gtk_icon_view_unselect_all (view); - return; - } - - GtkTreePath *path = [model pathFromStyle:style]; - if (path) { - gtk_icon_view_unselect_all (view); - gtk_icon_view_select_path (view, path); - gtk_tree_path_free (path); - } -} - -@end - -// }}} -// {{{ GTK+ callbacks - -static void selection_changed_cb (GtkIconView *view, NodeStyleSelector *mgr) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - [[NSNotificationCenter defaultCenter] - postNotificationName:@"SelectedStyleChanged" - object:mgr]; - - [pool drain]; -} -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NodeStylesModel.h b/tikzit/src/gtk/NodeStylesModel.h deleted file mode 100644 index a048560..0000000 --- a/tikzit/src/gtk/NodeStylesModel.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class NodeStyle; -@class StyleManager; - -enum { - NODE_STYLES_NAME_COL = 0, - NODE_STYLES_ICON_COL, - NODE_STYLES_PTR_COL, - NODE_STYLES_N_COLS -}; - -@interface NodeStylesModel: NSObject { - GtkListStore *store; - StyleManager *styleManager; -} - -/*! - @property model - @brief The GTK+ tree model - */ -@property (readonly) GtkTreeModel *model; - -/*! - @property manager - @brief The StyleManager to use. - */ -@property (retain) StyleManager *styleManager; - -/*! - * Initialise with the given style manager - */ -- (id) initWithStyleManager:(StyleManager*)m; - -+ (id) modelWithStyleManager:(StyleManager*)m; - -- (NodeStyle*) styleFromPath:(GtkTreePath*)path; -- (GtkTreePath*) pathFromStyle:(NodeStyle*)style; -- (NodeStyle*) styleFromIter:(GtkTreeIter*)iter; -- (GtkTreeIter*) iterFromStyle:(NodeStyle*)style; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/NodeStylesModel.m b/tikzit/src/gtk/NodeStylesModel.m deleted file mode 100644 index 3cc5771..0000000 --- a/tikzit/src/gtk/NodeStylesModel.m +++ /dev/null @@ -1,381 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStylesModel.h" - -#import "CairoRenderContext.h" -#import "NodeStyle.h" -#import "Shape.h" -#import "Shape+Render.h" -#import "ShapeNames.h" -#import "StyleManager.h" - -#import "gtkhelpers.h" - -#import <gdk-pixbuf/gdk-pixbuf.h> - -// {{{ Internal interfaces - -@interface NodeStylesModel (Notifications) -- (void) nodeStylesReplaced:(NSNotification*)notification; -- (void) nodeStyleAdded:(NSNotification*)notification; -- (void) nodeStyleRemoved:(NSNotification*)notification; -- (void) shapeDictionaryReplaced:(NSNotification*)n; -- (void) observeValueForKeyPath:(NSString*)keyPath - ofObject:(id)object - change:(NSDictionary*)change - context:(void*)context; -@end - -@interface NodeStylesModel (Private) -- (cairo_surface_t*) createNodeIconSurface; -- (GdkPixbuf*) pixbufOfNodeInStyle:(NodeStyle*)style; -- (GdkPixbuf*) pixbufOfNodeInStyle:(NodeStyle*)style usingSurface:(cairo_surface_t*)surface; -- (void) addNodeStyle:(NodeStyle*)style; -- (void) addNodeStyle:(NodeStyle*)style usingSurface:(cairo_surface_t*)surface; -- (void) observeNodeStyle:(NodeStyle*)style; -- (void) stopObservingNodeStyle:(NodeStyle*)style; -- (void) clearNodeStylesModel; -- (void) reloadNodeStyles; -@end - -// }}} -// {{{ API - -@implementation NodeStylesModel - -+ (id) modelWithStyleManager:(StyleManager*)m { - return [[[self alloc] initWithStyleManager:m] autorelease]; -} - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)m { - self = [super init]; - - if (self) { - store = gtk_list_store_new (NODE_STYLES_N_COLS, - G_TYPE_STRING, - GDK_TYPE_PIXBUF, - G_TYPE_POINTER); - g_object_ref_sink (store); - - [self setStyleManager:m]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(shapeDictionaryReplaced:) - name:@"ShapeDictionaryReplaced" - object:[Shape class]]; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [self clearNodeStylesModel]; - g_object_unref (store); - [styleManager release]; - - [super dealloc]; -} - -- (StyleManager*) styleManager { - return styleManager; -} - -- (void) setStyleManager:(StyleManager*)m { - if (m == nil) { - [NSException raise:NSInvalidArgumentException format:@"Style manager cannot be nil"]; - } - [m retain]; - - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:styleManager]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeStylesReplaced:) - name:@"NodeStylesReplaced" - object:m]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeStyleAdded:) - name:@"NodeStyleAdded" - object:m]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeStyleRemoved:) - name:@"NodeStyleRemoved" - object:m]; - - [styleManager release]; - styleManager = m; - - [self reloadNodeStyles]; -} - -- (GtkTreeModel*) model { - return GTK_TREE_MODEL (store); -} - -- (NodeStyle*) styleFromPath:(GtkTreePath*)path { - GtkTreeIter iter; - gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path); - NodeStyle *style = nil; - gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, NODE_STYLES_PTR_COL, &style, -1); - return style; -} - -- (GtkTreePath*) pathFromStyle:(NodeStyle*)style { - GtkTreeModel *m = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (m, &row)) { - do { - NodeStyle *rowStyle; - gtk_tree_model_get (m, &row, NODE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - return gtk_tree_model_get_path (m, &row); - } - } while (gtk_tree_model_iter_next (m, &row)); - } - return NULL; -} - -- (NodeStyle*) styleFromIter:(GtkTreeIter*)iter { - NodeStyle *style = nil; - gtk_tree_model_get (GTK_TREE_MODEL (store), iter, NODE_STYLES_PTR_COL, &style, -1); - return style; -} - -- (GtkTreeIter*) iterFromStyle:(NodeStyle*)style { - GtkTreeModel *m = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (m, &row)) { - do { - NodeStyle *rowStyle; - gtk_tree_model_get (m, &row, NODE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - return gtk_tree_iter_copy (&row); - } - } while (gtk_tree_model_iter_next (m, &row)); - } - return NULL; -} -@end - -// }}} -// {{{ Notifications - -@implementation NodeStylesModel (Notifications) - -- (void) nodeStylesReplaced:(NSNotification*)notification { - [self reloadNodeStyles]; -} - -- (void) nodeStyleAdded:(NSNotification*)notification { - [self addNodeStyle:[[notification userInfo] objectForKey:@"style"]]; -} - -- (void) nodeStyleRemoved:(NSNotification*)notification { - NodeStyle *style = [[notification userInfo] objectForKey:@"style"]; - - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - NodeStyle *rowStyle; - gtk_tree_model_get (model, &row, NODE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - gtk_list_store_remove (store, &row); - [self stopObservingNodeStyle:rowStyle]; - [rowStyle release]; - return; - } - } while (gtk_tree_model_iter_next (model, &row)); - } -} - -- (void) observeValueForKeyPath:(NSString*)keyPath - ofObject:(id)object - change:(NSDictionary*)change - context:(void*)context -{ - if ([object class] == [NodeStyle class]) { - NodeStyle *style = object; - - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - NodeStyle *rowStyle; - gtk_tree_model_get (model, &row, NODE_STYLES_PTR_COL, &rowStyle, -1); - if (style == rowStyle) { - if ([@"name" isEqual:keyPath]) { - gtk_list_store_set (store, &row, NODE_STYLES_NAME_COL, [[style name] UTF8String], -1); - } else { - GdkPixbuf *pixbuf = [self pixbufOfNodeInStyle:style]; - gtk_list_store_set (store, &row, NODE_STYLES_ICON_COL, pixbuf, -1); - g_object_unref (pixbuf); - } - } - } while (gtk_tree_model_iter_next (model, &row)); - } - } -} - -- (void) shapeDictionaryReplaced:(NSNotification*)n { - [self reloadNodeStyles]; -} -@end - -// }}} -// {{{ Private - -@implementation NodeStylesModel (Private) -- (cairo_surface_t*) createNodeIconSurface { - return cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 24, 24); -} - -- (GdkPixbuf*) pixbufOfNodeInStyle:(NodeStyle*)style { - cairo_surface_t *surface = [self createNodeIconSurface]; - GdkPixbuf *pixbuf = [self pixbufOfNodeInStyle:style usingSurface:surface]; - cairo_surface_destroy (surface); - return pixbuf; -} - -- (GdkPixbuf*) pixbufOfNodeInStyle:(NodeStyle*)style usingSurface:(cairo_surface_t*)surface { - Shape *shape = [Shape shapeForName:[style shapeName]]; - - int width = cairo_image_surface_get_width (surface); - int height = cairo_image_surface_get_height (surface); - NSRect pixbufBounds = NSMakeRect(0.0, 0.0, width, height); - const CGFloat lineWidth = [style strokeThickness]; - Transformer *shapeTrans = [Transformer transformerToFit:[shape boundingRect] - intoScreenRect:NSInsetRect(pixbufBounds, lineWidth, lineWidth) - flippedAboutXAxis:YES]; - if ([style scale] < 1.0) - [shapeTrans setScale:[style scale] * [shapeTrans scale]]; - - CairoRenderContext *context = [[CairoRenderContext alloc] initForSurface:surface]; - [context clearSurface]; - [shape drawPathWithTransform:shapeTrans andContext:context]; - [context setLineWidth:lineWidth]; - [context strokePathWithColor:[[style strokeColorRGB] rColor] - andFillWithColor:[[style fillColorRGB] rColor]]; - [context release]; - - return pixbuf_get_from_surface (surface); -} - -- (void) addNodeStyle:(NodeStyle*)style usingSurface:(cairo_surface_t*)surface { - GtkTreeIter iter; - gtk_list_store_append (store, &iter); - - GdkPixbuf *pixbuf = [self pixbufOfNodeInStyle:style usingSurface:surface]; - gtk_list_store_set (store, &iter, - NODE_STYLES_NAME_COL, [[style name] UTF8String], - NODE_STYLES_ICON_COL, pixbuf, - NODE_STYLES_PTR_COL, (gpointer)[style retain], - -1); - g_object_unref (pixbuf); - [self observeNodeStyle:style]; -} - -- (void) addNodeStyle:(NodeStyle*)style { - cairo_surface_t *surface = [self createNodeIconSurface]; - [self addNodeStyle:style usingSurface:surface]; - cairo_surface_destroy (surface); -} - -- (void) observeNodeStyle:(NodeStyle*)style { - [style addObserver:self - forKeyPath:@"name" - options:NSKeyValueObservingOptionNew - context:NULL]; - [style addObserver:self - forKeyPath:@"strokeThickness" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"strokeColorRGB.red" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"strokeColorRGB.green" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"strokeColorRGB.blue" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"fillColorRGB.red" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"fillColorRGB.green" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"fillColorRGB.blue" - options:0 - context:NULL]; - [style addObserver:self - forKeyPath:@"shapeName" - options:0 - context:NULL]; -} - -- (void) stopObservingNodeStyle:(NodeStyle*)style { - [style removeObserver:self forKeyPath:@"name"]; - [style removeObserver:self forKeyPath:@"strokeThickness"]; - [style removeObserver:self forKeyPath:@"strokeColorRGB.red"]; - [style removeObserver:self forKeyPath:@"strokeColorRGB.green"]; - [style removeObserver:self forKeyPath:@"strokeColorRGB.blue"]; - [style removeObserver:self forKeyPath:@"fillColorRGB.red"]; - [style removeObserver:self forKeyPath:@"fillColorRGB.green"]; - [style removeObserver:self forKeyPath:@"fillColorRGB.blue"]; - [style removeObserver:self forKeyPath:@"shapeName"]; -} - -- (void) clearNodeStylesModel { - GtkTreeModel *model = GTK_TREE_MODEL (store); - GtkTreeIter row; - if (gtk_tree_model_get_iter_first (model, &row)) { - do { - NodeStyle *rowStyle; - gtk_tree_model_get (model, &row, NODE_STYLES_PTR_COL, &rowStyle, -1); - [self stopObservingNodeStyle:rowStyle]; - [rowStyle release]; - } while (gtk_tree_model_iter_next (model, &row)); - } - gtk_list_store_clear (store); -} - -- (void) reloadNodeStyles { - [self clearNodeStylesModel]; - cairo_surface_t *surface = [self createNodeIconSurface]; - for (NodeStyle *style in [styleManager nodeStyles]) { - [self addNodeStyle:style usingSurface:surface]; - } - cairo_surface_destroy (surface); -} -@end - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NodeStylesPalette.h b/tikzit/src/gtk/NodeStylesPalette.h deleted file mode 100644 index ac712ea..0000000 --- a/tikzit/src/gtk/NodeStylesPalette.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class StyleManager; -@class NodeStyleSelector; -@class NodeStyleEditor; - -@interface NodeStylesPalette: NSObject { - NodeStyleSelector *selector; - NodeStyleEditor *editor; - - GtkWidget *palette; - - GtkWidget *removeStyleButton; - GtkWidget *applyStyleButton; - GtkWidget *clearStyleButton; -} - -@property (retain) StyleManager *styleManager; -@property (readonly) GtkWidget *widget; - -- (id) initWithManager:(StyleManager*)m; - -@end - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/NodeStylesPalette.m b/tikzit/src/gtk/NodeStylesPalette.m deleted file mode 100644 index e28edbb..0000000 --- a/tikzit/src/gtk/NodeStylesPalette.m +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "NodeStylesPalette.h" - -#import "NodeStyleSelector.h" -#import "NodeStyleEditor.h" -#import "NodeStylesModel.h" -#import "StyleManager.h" - -// {{{ Internal interfaces -// {{{ GTK+ Callbacks -static void add_style_button_cb (GtkButton *widget, NodeStylesPalette *palette); -static void remove_style_button_cb (GtkButton *widget, NodeStylesPalette *palette); -// }}} -// {{{ Notifications - -@interface NodeStylesPalette (Notifications) -- (void) selectedStyleChanged:(NSNotification*)notification; -@end - -// }}} -// {{{ Private - -@interface NodeStylesPalette (Private) -- (void) updateButtonState; -- (void) removeSelectedStyle; -- (void) addStyle; -@end - -// }}} -// }}} -// {{{ API - -@implementation NodeStylesPalette - -@synthesize widget=palette; - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithManager:(StyleManager*)m { - self = [super init]; - - if (self) { - selector = [[NodeStyleSelector alloc] initWithStyleManager:m]; - editor = [[NodeStyleEditor alloc] init]; - - palette = gtk_vbox_new (FALSE, 6); - gtk_container_set_border_width (GTK_CONTAINER (palette), 6); - g_object_ref_sink (palette); - - GtkWidget *mainBox = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (palette), mainBox, FALSE, FALSE, 0); - gtk_widget_show (mainBox); - - GtkWidget *selectorScroller = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (selectorScroller), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - GtkWidget *selectorFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (selectorScroller), [selector widget]); - gtk_container_add (GTK_CONTAINER (selectorFrame), selectorScroller); - gtk_box_pack_start (GTK_BOX (mainBox), selectorFrame, TRUE, TRUE, 0); - gtk_widget_show (selectorScroller); - gtk_widget_show (selectorFrame); - gtk_widget_show ([selector widget]); - - gtk_box_pack_start (GTK_BOX (mainBox), [editor widget], TRUE, TRUE, 0); - gtk_widget_show ([editor widget]); - - GtkBox *buttonBox = GTK_BOX (gtk_hbox_new(FALSE, 0)); - gtk_box_pack_start (GTK_BOX (palette), GTK_WIDGET (buttonBox), FALSE, FALSE, 0); - - GtkWidget *addStyleButton = gtk_button_new (); - gtk_widget_set_tooltip_text (addStyleButton, "Add a new style"); - GtkWidget *addIcon = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (addStyleButton), addIcon); - gtk_box_pack_start (buttonBox, addStyleButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (addStyleButton), - "clicked", - G_CALLBACK (add_style_button_cb), - self); - - removeStyleButton = gtk_button_new (); - g_object_ref_sink (removeStyleButton); - gtk_widget_set_tooltip_text (removeStyleButton, "Delete selected style"); - GtkWidget *removeIcon = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (removeStyleButton), removeIcon); - gtk_box_pack_start (buttonBox, removeStyleButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (removeStyleButton), - "clicked", - G_CALLBACK (remove_style_button_cb), - self); - - gtk_widget_show_all (GTK_WIDGET (buttonBox)); - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(selectedStyleChanged:) - name:@"SelectedStyleChanged" - object:selector]; - - [self updateButtonState]; - } - - return self; -} - -- (StyleManager*) styleManager { - return [[selector model] styleManager]; -} - -- (void) setStyleManager:(StyleManager*)m { - [[selector model] setStyleManager:m]; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [editor release]; - [selector release]; - g_object_unref (palette); - g_object_unref (removeStyleButton); - - [super dealloc]; -} - -@end - -// }}} -// {{{ Notifications - -@implementation NodeStylesPalette (Notifications) -- (void) selectedStyleChanged:(NSNotification*)notification { - [editor setStyle:[selector selectedStyle]]; - [self updateButtonState]; -} -@end - -// }}} -// {{{ Private - -@implementation NodeStylesPalette (Private) -- (void) updateButtonState { - gboolean hasStyleSelection = [selector selectedStyle] != nil; - - gtk_widget_set_sensitive (removeStyleButton, hasStyleSelection); -} - -- (void) removeSelectedStyle { - NodeStyle *style = [selector selectedStyle]; - if (style) - [[[selector model] styleManager] removeNodeStyle:style]; -} - -- (void) addStyle { - NodeStyle *newStyle = [NodeStyle defaultNodeStyleWithName:@"newstyle"]; - [[self styleManager] addNodeStyle:newStyle]; - [selector setSelectedStyle:newStyle]; - [editor selectNameField]; -} - -@end - -// }}} -// {{{ GTK+ callbacks - -static void add_style_button_cb (GtkButton *widget, NodeStylesPalette *palette) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [palette addStyle]; - [pool drain]; -} - -static void remove_style_button_cb (GtkButton *widget, NodeStylesPalette *palette) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [palette removeSelectedStyle]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/PreambleEditor.h b/tikzit/src/gtk/PreambleEditor.h deleted file mode 100644 index f181446..0000000 --- a/tikzit/src/gtk/PreambleEditor.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Preambles; - -@interface PreambleEditor: NSObject { - Preambles *preambles; - - // we don't keep any refs, as we control - // the top window - GtkWindow *parentWindow; - GtkWindow *window; - GtkListStore *preambleListStore; - GtkTreeView *preambleSelector; - GtkTextView *preambleView; - BOOL blockSignals; - BOOL adding; -} - -- (id) initWithPreambles:(Preambles*)p; - -- (void) setParentWindow:(GtkWindow*)parent; - -- (Preambles*) preambles; - -- (void) present; -- (void) show; -- (void) hide; -- (BOOL) isVisible; -- (void) setVisible:(BOOL)visible; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/PreambleEditor.m b/tikzit/src/gtk/PreambleEditor.m deleted file mode 100644 index d1f72ee..0000000 --- a/tikzit/src/gtk/PreambleEditor.m +++ /dev/null @@ -1,568 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "PreambleEditor.h" - -#import "Application.h" -#import "Preambles.h" -#import <gdk/gdk.h> - -enum { - NAME_COLUMN, - IS_CUSTOM_COLUMN, - N_COLUMNS -}; - -// {{{ Internal interfaces -// {{{ Signals -static gboolean window_delete_event_cb (GtkWidget *widget, - GdkEvent *event, - PreambleEditor *editor); -static gboolean window_focus_out_event_cb (GtkWidget *widget, - GdkEvent *event, - PreambleEditor *editor); -static void close_button_clicked_cb (GtkButton *widget, PreambleEditor *editor); -static void add_button_clicked_cb (GtkButton *widget, PreambleEditor *editor); -static void remove_button_clicked_cb (GtkButton *widget, PreambleEditor *editor); -/* -static void undo_button_clicked_cb (GtkButton *widget, PreambleEditor *editor); -static void redo_button_clicked_cb (GtkButton *widget, PreambleEditor *editor); -*/ -static void preamble_name_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PreambleEditor *editor); -static void preamble_selection_changed_cb (GtkTreeSelection *treeselection, - PreambleEditor *editor); -// }}} - -@interface PreambleEditor (Private) -- (void) loadUi; -- (void) save; -- (void) revert; -- (void) update; -- (void) fillListStore; -- (BOOL) isDefaultPreambleSelected; -- (NSString*) selectedPreambleName; -- (void) addPreamble; -- (void) deletePreamble; -- (void) renamePreambleAtPath:(gchar*)path to:(gchar*)newValue; -- (void) nodeStylePropertyChanged:(NSNotification*)notification; -- (void) edgeStylePropertyChanged:(NSNotification*)notification; -@end - -// }}} -// {{{ API - -@implementation PreambleEditor - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithPreambles:(Preambles*)p { - self = [super init]; - - if (self) { - preambles = [p retain]; - parentWindow = NULL; - window = NULL; - preambleView = NULL; - preambleSelector = NULL; - blockSignals = NO; - adding = NO; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeStylePropertyChanged:) - name:@"NodeStylePropertyChanged" - object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeStylePropertyChanged:) - name:@"EdgeStylePropertyChanged" - object:nil]; - } - - return self; -} - -- (Preambles*) preambles { - return preambles; -} - -- (void) setParentWindow:(GtkWindow*)parent { - GtkWindow *oldParent = parentWindow; - - if (parentWindow) - g_object_ref (parentWindow); - parentWindow = parent; - if (oldParent) - g_object_unref (oldParent); - - if (window) { - gtk_window_set_transient_for (window, parentWindow); - } -} - -- (void) present { - [self loadUi]; - gtk_window_present (GTK_WINDOW (window)); - [self revert]; -} - -- (void) show { - [self loadUi]; - gtk_widget_show (GTK_WIDGET (window)); - [self revert]; -} - -- (void) hide { - if (!window) { - return; - } - [self save]; - gtk_widget_hide (GTK_WIDGET (window)); -} - -- (BOOL) isVisible { - if (!window) { - return NO; - } - gboolean visible; - g_object_get (G_OBJECT (window), "visible", &visible, NULL); - return visible ? YES : NO; -} - -- (void) setVisible:(BOOL)visible { - if (visible) { - [self show]; - } else { - [self hide]; - } -} - -- (void) dealloc { - [preambles release]; - preambles = nil; - if (window) { - gtk_widget_destroy (GTK_WIDGET (window)); - window = NULL; - } - if (parentWindow) { - g_object_ref (parentWindow); - } - - [super dealloc]; -} - -@end - -// }}} -// {{{ Private - -@implementation PreambleEditor (Private) -- (GtkWidget*) createPreambleList { - preambleListStore = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_BOOLEAN); - preambleSelector = GTK_TREE_VIEW (gtk_tree_view_new_with_model ( - GTK_TREE_MODEL (preambleListStore))); - gtk_widget_set_size_request (GTK_WIDGET (preambleSelector), 150, -1); - gtk_tree_view_set_headers_visible (preambleSelector, FALSE); - - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Preamble", - renderer, - "text", NAME_COLUMN, - "editable", IS_CUSTOM_COLUMN, - NULL); - gtk_tree_view_append_column (preambleSelector, column); - g_signal_connect (G_OBJECT (renderer), - "edited", - G_CALLBACK (preamble_name_edited_cb), - self); - - GtkWidget *listScroller = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (listScroller), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (listScroller), - GTK_WIDGET (preambleSelector)); - - [self fillListStore]; - - GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector); - gtk_tree_selection_set_mode (sel, GTK_SELECTION_BROWSE); - g_signal_connect (G_OBJECT (sel), - "changed", - G_CALLBACK (preamble_selection_changed_cb), - self); - - return listScroller; -} - -- (void) loadUi { - if (window) { - return; - } - - window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - gtk_window_set_title (window, "Preamble editor"); - gtk_window_set_position (window, GTK_WIN_POS_CENTER_ON_PARENT); - gtk_window_set_default_size (window, 600, 400); - gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); - if (parentWindow) { - gtk_window_set_transient_for (window, parentWindow); - } - GdkEventMask mask; - g_object_get (G_OBJECT (window), "events", &mask, NULL); - mask |= GDK_FOCUS_CHANGE_MASK; - g_object_set (G_OBJECT (window), "events", mask, NULL); - g_signal_connect (window, - "delete-event", - G_CALLBACK (window_delete_event_cb), - self); - g_signal_connect (window, - "focus-out-event", - G_CALLBACK (window_focus_out_event_cb), - self); - - GtkWidget *mainBox = gtk_vbox_new (FALSE, 18); - gtk_container_set_border_width (GTK_CONTAINER (mainBox), 12); - gtk_container_add (GTK_CONTAINER (window), mainBox); - - GtkPaned *paned = GTK_PANED (gtk_hpaned_new ()); - gtk_box_pack_start (GTK_BOX (mainBox), - GTK_WIDGET (paned), - TRUE, TRUE, 0); - - GtkWidget *listWidget = [self createPreambleList]; - GtkWidget *listFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (listFrame), listWidget); - - GtkBox *listBox = GTK_BOX (gtk_vbox_new (FALSE, 6)); - gtk_box_pack_start (listBox, listFrame, TRUE, TRUE, 0); - - GtkContainer *listButtonBox = GTK_CONTAINER (gtk_hbox_new (FALSE, 6)); - gtk_box_pack_start (listBox, GTK_WIDGET (listButtonBox), FALSE, TRUE, 0); - GtkWidget *addButton = gtk_button_new_from_stock (GTK_STOCK_ADD); - g_signal_connect (addButton, - "clicked", - G_CALLBACK (add_button_clicked_cb), - self); - gtk_container_add (listButtonBox, addButton); - GtkWidget *removeButton = gtk_button_new_from_stock (GTK_STOCK_REMOVE); - g_signal_connect (removeButton, - "clicked", - G_CALLBACK (remove_button_clicked_cb), - self); - gtk_container_add (listButtonBox, removeButton); - - gtk_paned_pack1 (paned, GTK_WIDGET (listBox), FALSE, TRUE); - - preambleView = GTK_TEXT_VIEW (gtk_text_view_new ()); - gtk_text_view_set_left_margin (preambleView, 3); - gtk_text_view_set_right_margin (preambleView, 3); - GtkWidget *scroller = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroller), - GTK_POLICY_AUTOMATIC, // horiz - GTK_POLICY_ALWAYS); // vert - gtk_container_add (GTK_CONTAINER (scroller), GTK_WIDGET (preambleView)); - GtkWidget *editorFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (editorFrame), scroller); - gtk_paned_pack2 (paned, editorFrame, TRUE, TRUE); - - GtkContainer *buttonBox = GTK_CONTAINER (gtk_hbutton_box_new ()); - gtk_box_set_spacing (GTK_BOX (buttonBox), 6); - gtk_button_box_set_layout (GTK_BUTTON_BOX (buttonBox), GTK_BUTTONBOX_END); - gtk_box_pack_start (GTK_BOX (mainBox), - GTK_WIDGET (buttonBox), - FALSE, TRUE, 0); - GtkWidget *closeButton = gtk_button_new_from_stock (GTK_STOCK_CLOSE); - gtk_container_add (buttonBox, closeButton); - g_signal_connect (closeButton, - "clicked", - G_CALLBACK (close_button_clicked_cb), - self); - /* - GtkWidget *undoButton = gtk_button_new_from_stock (GTK_STOCK_UNDO); - gtk_container_add (buttonBox, undoButton); - gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (buttonBox), - undoButton, - TRUE); - g_signal_connect (undoButton, - "clicked", - G_CALLBACK (undo_button_clicked_cb), - self); - GtkWidget *redoButton = gtk_button_new_from_stock (GTK_STOCK_REDO); - gtk_container_add (buttonBox, redoButton); - gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (buttonBox), - redoButton, - TRUE); - g_signal_connect (redoButton, - "clicked", - G_CALLBACK (redo_button_clicked_cb), - self); - */ - [self revert]; - - gtk_widget_show_all (mainBox); -} - -- (void) save { - if (!preambleView) - return; - if ([self isDefaultPreambleSelected]) - return; - GtkTextIter start,end; - GtkTextBuffer *preambleBuffer = gtk_text_view_get_buffer (preambleView); - gtk_text_buffer_get_bounds(preambleBuffer, &start, &end); - gchar *text = gtk_text_buffer_get_text(preambleBuffer, &start, &end, FALSE); - NSString *preamble = [NSString stringWithUTF8String:text]; - g_free (text); - [preambles setCurrentPreamble:preamble]; - [app saveConfiguration]; -} - -- (void) revert { - if (!preambleView) - return; - GtkTextBuffer *preambleBuffer = gtk_text_view_get_buffer (preambleView); - gtk_text_buffer_set_text (preambleBuffer, [[preambles currentPreamble] UTF8String], -1); - gtk_text_view_set_editable (preambleView, ![self isDefaultPreambleSelected]); -} - -- (void) update { - if (!blockSignals) { - [self save]; - } - GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector); - GtkTreeIter row; - GtkTreeModel *model; - if (gtk_tree_selection_get_selected (sel, &model, &row)) { - gchar *name; - gtk_tree_model_get (model, &row, NAME_COLUMN, &name, -1); - NSString *preambleName = [NSString stringWithUTF8String:name]; - [preambles setSelectedPreambleName:preambleName]; - g_free (name); - } - [self revert]; -} - -- (void) fillListStore { - blockSignals = YES; - - GtkTreeIter row; - gtk_list_store_clear (preambleListStore); - - gtk_list_store_append (preambleListStore, &row); - gtk_list_store_set (preambleListStore, &row, - NAME_COLUMN, [[preambles defaultPreambleName] UTF8String], - IS_CUSTOM_COLUMN, FALSE, - -1); - GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector); - if ([self isDefaultPreambleSelected]) { - gtk_tree_selection_select_iter (sel, &row); - } - - NSEnumerator *en = [preambles customPreambleNameEnumerator]; - NSString *preambleName; - while ((preambleName = [en nextObject])) { - gtk_list_store_append (preambleListStore, &row); - gtk_list_store_set (preambleListStore, &row, - NAME_COLUMN, [preambleName UTF8String], - IS_CUSTOM_COLUMN, TRUE, - -1); - if ([preambleName isEqualToString:[self selectedPreambleName]]) { - gtk_tree_selection_select_iter (sel, &row); - } - } - - blockSignals = NO; -} - -- (BOOL) isDefaultPreambleSelected { - return [preambles selectedPreambleIsDefault]; -} - -- (NSString*) selectedPreambleName { - return [preambles selectedPreambleName]; -} - -- (void) addPreamble { - NSString *newName = [preambles addPreamble]; - - GtkTreeIter row; - gtk_list_store_append (preambleListStore, &row); - gtk_list_store_set (preambleListStore, &row, - NAME_COLUMN, [newName UTF8String], - IS_CUSTOM_COLUMN, TRUE, - -1); - - GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector); - gtk_tree_selection_select_iter (sel, &row); -} - -- (void) deletePreamble { - if ([self isDefaultPreambleSelected]) - return; - - NSString *name = [self selectedPreambleName]; - - GtkTreeIter row; - GtkTreeModel *model = GTK_TREE_MODEL (preambleListStore); - - gtk_tree_model_get_iter_first (model, &row); - // ignore first; it is the default one - gboolean found = FALSE; - while (!found && gtk_tree_model_iter_next (model, &row)) { - gchar *candidate; - gtk_tree_model_get (model, &row, NAME_COLUMN, &candidate, -1); - if (g_strcmp0 (candidate, [name UTF8String]) == 0) { - found = TRUE; - } - g_free (candidate); - } - - if (!found) - return; - - if (![preambles removePreamble:name]) - return; - - blockSignals = YES; - - gboolean had_next = gtk_list_store_remove (preambleListStore, &row); - if (!had_next) { - // select the last item - gint length = gtk_tree_model_iter_n_children (model, NULL); - gtk_tree_model_iter_nth_child (model, &row, NULL, length - 1); - } - - GtkTreeSelection *sel = gtk_tree_view_get_selection (preambleSelector); - gtk_tree_selection_select_iter (sel, &row); - - [self revert]; - - blockSignals = NO; -} - -- (void) renamePreambleAtPath:(gchar*)path to:(gchar*)newValue { - NSString *newName = [NSString stringWithUTF8String:newValue]; - - GtkTreeIter row; - GtkTreeModel *model = GTK_TREE_MODEL (preambleListStore); - - if (!gtk_tree_model_get_iter_from_string (model, &row, path)) - return; - - gchar *oldValue; - gtk_tree_model_get (model, &row, NAME_COLUMN, &oldValue, -1); - - NSString* oldName = [NSString stringWithUTF8String:oldValue]; - if ([preambles renamePreambleFrom:oldName to:newName]) { - gtk_list_store_set (preambleListStore, &row, - NAME_COLUMN, newValue, - -1); - } -} - -- (void) nodeStylePropertyChanged:(NSNotification*)notification { - if ([self isDefaultPreambleSelected]) { - [self revert]; - } -} - -- (void) edgeStylePropertyChanged:(NSNotification*)notification { - if ([self isDefaultPreambleSelected]) { - [self revert]; - } -} -@end - -// }}} -// {{{ GTK+ callbacks - -static gboolean window_delete_event_cb (GtkWidget *widget, - GdkEvent *event, - PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor hide]; - [pool drain]; - return TRUE; // we dealt with this event -} - -static gboolean window_focus_out_event_cb (GtkWidget *widget, - GdkEvent *event, - PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor save]; - [pool drain]; - return FALSE; -} - -static void close_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor hide]; - [pool drain]; -} - -static void add_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor addPreamble]; - [pool drain]; -} - -static void remove_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor deletePreamble]; - [pool drain]; -} - -/* -static void undo_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSLog(@"Undo"); - [pool drain]; -} - -static void redo_button_clicked_cb (GtkButton *widget, PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSLog(@"Redo"); - [pool drain]; -} -*/ - -static void preamble_name_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor renamePreambleAtPath:path to:new_text]; - [pool drain]; -} - -static void preamble_selection_changed_cb (GtkTreeSelection *treeselection, - PreambleEditor *editor) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor update]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/Preambles+Storage.h b/tikzit/src/gtk/Preambles+Storage.h deleted file mode 100644 index 76f56cc..0000000 --- a/tikzit/src/gtk/Preambles+Storage.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Preambles.h" - -@interface Preambles (Storage) - -+ (Preambles*) preamblesFromDirectory:(NSString*)directory; -- (id) initFromDirectory:(NSString*)directory; -- (void) loadFromDirectory:(NSString*)directory; -- (void) storeToDirectory:(NSString*)directory; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Preambles+Storage.m b/tikzit/src/gtk/Preambles+Storage.m deleted file mode 100644 index bd3ea03..0000000 --- a/tikzit/src/gtk/Preambles+Storage.m +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Preambles+Storage.h" - -static NSString *ext = @"preamble"; - -@implementation Preambles (Storage) - -+ (Preambles*) preamblesFromDirectory:(NSString*)directory { - return [[[self alloc] initFromDirectory:directory] autorelease]; -} - -- (id) initFromDirectory:(NSString*)directory { - BOOL isDir = NO; - if ([[NSFileManager defaultManager] fileExistsAtPath:directory isDirectory:&isDir] && isDir) { - self = [super init]; - - if (self) { - selectedPreambleName = @"default"; - preambleDict = nil; - [self loadFromDirectory:directory]; - } - } else { - self = [self init]; - } - - return self; -} - -- (void) loadFromDirectory:(NSString*)directory { - preambleDict = [[NSMutableDictionary alloc] initWithCapacity:1]; - NSDirectoryEnumerator *en = [[NSFileManager defaultManager] enumeratorAtPath:directory]; - NSString *filename; - while ((filename = [en nextObject]) != nil) { - if ([filename hasSuffix:ext] && [[en fileAttributes] fileType] == NSFileTypeRegular) { - NSString *path = [directory stringByAppendingPathComponent:filename]; - NSString *contents = [NSString stringWithContentsOfFile:path]; - if (contents) { - [preambleDict setObject:contents forKey:[filename stringByDeletingPathExtension]]; - } - } - } -} - -- (void) storeToDirectory:(NSString*)directory { - NSDirectoryEnumerator *den = [[NSFileManager defaultManager] enumeratorAtPath:directory]; - NSString *filename; - while ((filename = [den nextObject]) != nil) { - if ([filename hasSuffix:ext] && [[den fileAttributes] fileType] == NSFileTypeRegular) { - NSString *path = [directory stringByAppendingPathComponent:filename]; - NSString *entry = [filename stringByDeletingPathExtension]; - if ([preambleDict objectForKey:entry] == nil) { - [[NSFileManager defaultManager] removeFileAtPath:path handler:nil]; - } - } - } - - NSEnumerator *en = [self customPreambleNameEnumerator]; - NSString *entry; - while ((entry = [en nextObject]) != nil) { - NSString *path = [directory stringByAppendingPathComponent:[entry stringByAppendingPathExtension:ext]]; - NSString *contents = [preambleDict objectForKey:entry]; - [contents writeToFile:path atomically:YES]; - } -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PreviewRenderer.h b/tikzit/src/gtk/PreviewRenderer.h deleted file mode 100644 index d691722..0000000 --- a/tikzit/src/gtk/PreviewRenderer.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <poppler.h> - -#import "Surface.h" - -@class Configuration; -@class Preambles; -@class TikzDocument; - -@interface PreviewRenderer: NSObject<RenderDelegate> { - Configuration *config; - Preambles *preambles; - TikzDocument *document; - PopplerDocument *pdfDocument; - PopplerPage *pdfPage; -} - -@property (readonly) Preambles *preambles; -@property (retain) TikzDocument *document; -@property (readonly) double height; -@property (readonly) double width; - -- (id) initWithPreambles:(Preambles*)p config:(Configuration*)c; - -- (BOOL) updateWithError:(NSError**)error; -- (BOOL) update; -- (BOOL) isValid; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PreviewRenderer.m b/tikzit/src/gtk/PreviewRenderer.m deleted file mode 100644 index 28113d6..0000000 --- a/tikzit/src/gtk/PreviewRenderer.m +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "PreviewRenderer.h" - -#import "CairoRenderContext.h" -#import "Configuration.h" -#import "Preambles.h" -#import "TikzDocument.h" - -@implementation PreviewRenderer - -@synthesize preambles, document; - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithPreambles:(Preambles*)p config:(Configuration*)c { - self = [super init]; - - if (self) { - document = nil; - config = [c retain]; - preambles = [p retain]; - pdfDocument = NULL; - pdfPage = NULL; - } - - return self; -} - -- (void) dealloc { - [document release]; - [config release]; - [preambles release]; - - if (pdfDocument) { - g_object_unref (pdfDocument); - pdfDocument = NULL; - } - if (pdfPage) { - g_object_unref (pdfPage); - pdfPage = NULL; - } - - [super dealloc]; -} - -- (BOOL) update { - NSError *error = nil; - BOOL result = [self updateWithError:&error]; - if (error) { - logError (error, @"Could not update preview"); - if ([error code] == TZ_ERR_TOOL_FAILED) { - NSLog (@"Output: %@", [[error userInfo] objectForKey:TZToolOutputErrorKey]); - } - } - return result; -} - -- (BOOL) updateWithError:(NSError**)error { - if (document == nil) { - if (error) { - *error = [NSError errorWithMessage:@"No document given" code:TZ_ERR_BADSTATE]; - } - if (pdfDocument) { - g_object_unref (pdfDocument); - pdfDocument = NULL; - } - if (pdfPage) { - g_object_unref (pdfPage); - pdfPage = NULL; - } - return NO; - } - - NSString *tex = [preambles buildDocumentForTikz:[document tikz]]; - - NSString *tempDir = [[NSFileManager defaultManager] createTempDirectoryWithError:error]; - if (!tempDir) { - if (error) { - *error = [NSError errorWithMessage:@"Could not create temporary directory" code:TZ_ERR_IO cause:*error]; - } - return NO; - } - - // write tex code to temporary file - NSString *texFile = [NSString stringWithFormat:@"%@/tikzit.tex", tempDir]; - NSString *pdfFile = [NSString stringWithFormat:@"file://%@/tikzit.pdf", tempDir]; - [tex writeToFile:texFile atomically:YES]; - - NSTask *latexTask = [[NSTask alloc] init]; - [latexTask setCurrentDirectoryPath:tempDir]; - - // GNUStep is clever enough to use PATH - NSString *path = [config stringEntry:@"pdflatex" - inGroup:@"Previews" - withDefault:@"pdflatex"]; - [latexTask setLaunchPath:path]; - - NSArray *args = [NSArray arrayWithObjects: - @"-fmt=latex", - @"-output-format=pdf", - @"-interaction=nonstopmode", - @"-halt-on-error", - texFile, - nil]; - [latexTask setArguments:args]; - - NSPipe *pout = [NSPipe pipe]; - [latexTask setStandardOutput:pout]; - - NSFileHandle *latexOut = [pout fileHandleForReading]; - - BOOL success = NO; - - NS_DURING { - [latexTask launch]; - [latexTask waitUntilExit]; - } NS_HANDLER { - NSLog(@"Failed to run '%@'; error was: %@", path, [localException reason]); - (void)localException; - if (error) { - NSString *desc = [NSString stringWithFormat:@"Failed to run '%@'", path]; - NSMutableDictionary *errorDetail = [NSMutableDictionary dictionaryWithCapacity:2]; - [errorDetail setValue:desc forKey:NSLocalizedDescriptionKey]; - *error = [NSError errorWithDomain:TZErrorDomain code:TZ_ERR_IO userInfo:errorDetail]; - } - - // remove all temporary files - [[NSFileManager defaultManager] removeFileAtPath:tempDir handler:NULL]; - [latexTask release]; - - return NO; - } NS_ENDHANDLER - - if ([latexTask terminationStatus] != 0) { - if (error) { - NSData *data = [latexOut readDataToEndOfFile]; - NSString *str = [[NSString alloc] initWithData:data - encoding:NSUTF8StringEncoding]; - NSMutableDictionary *errorDetail = [NSMutableDictionary dictionaryWithCapacity:2]; - [errorDetail setValue:@"Generating a PDF file with pdflatex failed" forKey:NSLocalizedDescriptionKey]; - [errorDetail setValue:str forKey:TZToolOutputErrorKey]; - *error = [NSError errorWithDomain:TZErrorDomain code:TZ_ERR_TOOL_FAILED userInfo:errorDetail]; - [str release]; - } - } else { - // load pdf document - GError* gerror = NULL; - pdfDocument = poppler_document_new_from_file([pdfFile UTF8String], NULL, &gerror); - if (!pdfDocument) { - if (error) { - *error = [NSError errorWithMessage:[NSString stringWithFormat:@"Could not load PDF document", pdfFile] - code:TZ_ERR_IO - cause:[NSError errorWithGError:gerror]]; - } - g_error_free(gerror); - } else { - pdfPage = poppler_document_get_page(pdfDocument, 0); - if(!pdfPage) { - if (error) { - *error = [NSError errorWithMessage:@"Could not open first page of PDF document" - code:TZ_ERR_OTHER]; - } - g_object_unref(pdfDocument); - } else { - success = YES; - } - } - } - - // remove all temporary files - [[NSFileManager defaultManager] removeFileAtPath:tempDir handler:NULL]; - [latexTask release]; - - return success; -} - -- (BOOL) isValid { - return pdfPage ? YES : NO; -} - -- (double) width { - double w = 0.0; - if (pdfPage) - poppler_page_get_size(pdfPage, &w, NULL); - return w; -} - -- (double) height { - double h = 0.0; - if (pdfPage) - poppler_page_get_size(pdfPage, NULL, &h); - return h; -} - -- (void) renderWithContext:(id<RenderContext>)c onSurface:(id<Surface>)surface { - if (document != nil && pdfPage) { - CairoRenderContext *context = (CairoRenderContext*)c; - - double w = 0.0; - double h = 0.0; - poppler_page_get_size(pdfPage, &w, &h); - if (w==0) w = 1.0; - if (h==0) h = 1.0; - - double scale = ([surface height] / h) * 0.95; - if (w * scale > [surface width]) scale = [surface width] / w; - [[surface transformer] setScale:scale]; - - NSPoint origin; - w *= scale; - h *= scale; - origin.x = ([surface width] - w) / 2; - origin.y = ([surface height] - h) / 2; - - [[surface transformer] setOrigin:origin]; - - [context saveState]; - [context applyTransform:[surface transformer]]; - - // white-out - [context paintWithColor:WhiteRColor]; - - poppler_page_render (pdfPage, [context cairoContext]); - - [context restoreState]; - } -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PreviewWindow.h b/tikzit/src/gtk/PreviewWindow.h deleted file mode 100644 index 8bcd3e5..0000000 --- a/tikzit/src/gtk/PreviewWindow.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class Preambles; -@class PreviewRenderer; -@class TikzDocument; -@class WidgetSurface; - -@interface PreviewWindow: NSObject { - PreviewRenderer *previewer; - GtkWindow *window; - WidgetSurface *surface; - GtkWindow *parent; -} - -- (id) initWithPreambles:(Preambles*)p config:(Configuration*)c; - -- (void) setParentWindow:(GtkWindow*)parent; - -- (TikzDocument*) document; -- (void) setDocument:(TikzDocument*)doc; - -- (BOOL) update; - -- (void) present; -- (void) show; -- (void) hide; -- (BOOL) isVisible; -- (void) setVisible:(BOOL)visible; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PreviewWindow.m b/tikzit/src/gtk/PreviewWindow.m deleted file mode 100644 index fc0e7a3..0000000 --- a/tikzit/src/gtk/PreviewWindow.m +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "PreviewWindow.h" - -#import "Preambles.h" -#import "PreviewRenderer.h" -#import "TikzDocument.h" -#import "WidgetSurface.h" - -#import "gtkhelpers.h" - -@interface PreviewWindow (Private) -- (BOOL) updateOrShowError; -- (void) updateDefaultSize; -@end - -// {{{ API - -@implementation PreviewWindow - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithPreambles:(Preambles*)p config:(Configuration*)c { - self = [super init]; - - if (self) { - parent = NULL; - previewer = [[PreviewRenderer alloc] initWithPreambles:p config:c]; - - window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - gtk_window_set_title (window, "Preview"); - gtk_window_set_resizable (window, TRUE); - gtk_window_set_default_size (window, 150.0, 150.0); - g_signal_connect (G_OBJECT (window), - "delete-event", - G_CALLBACK (gtk_widget_hide_on_delete), - NULL); - - GtkWidget *pdfArea = gtk_drawing_area_new (); - gtk_container_add (GTK_CONTAINER (window), pdfArea); - gtk_widget_show (pdfArea); - surface = [[WidgetSurface alloc] initWithWidget:pdfArea]; - [surface setRenderDelegate:previewer]; - Transformer *t = [surface transformer]; - [t setFlippedAboutXAxis:![t isFlippedAboutXAxis]]; - } - - return self; -} - -- (void) setParentWindow:(GtkWindow*)p { - parent = p; - gtk_window_set_transient_for (window, p); - if (p != NULL) { - gtk_window_set_position (window, GTK_WIN_POS_CENTER_ON_PARENT); - } -} - -- (TikzDocument*) document { - return [previewer document]; -} - -- (void) setDocument:(TikzDocument*)doc { - [previewer setDocument:doc]; -} - -- (void) present { - if ([self updateOrShowError]) { - [self updateDefaultSize]; - gtk_window_present (GTK_WINDOW (window)); - [surface invalidate]; - } -} - -- (BOOL) update { - if ([self updateOrShowError]) { - [self updateDefaultSize]; - return YES; - } - - return NO; -} - -- (void) show { - if ([self updateOrShowError]) { - [self updateDefaultSize]; - gtk_widget_show (GTK_WIDGET (window)); - [surface invalidate]; - } -} - -- (void) hide { - gtk_widget_hide (GTK_WIDGET (window)); -} - -- (BOOL) isVisible { - gboolean visible; - g_object_get (G_OBJECT (window), "visible", &visible, NULL); - return visible ? YES : NO; -} - -- (void) setVisible:(BOOL)visible { - if (visible) { - [self show]; - } else { - [self hide]; - } -} - -- (void) dealloc { - gtk_widget_destroy (GTK_WIDGET (window)); - [previewer release]; - [surface release]; - - [super dealloc]; -} - -@end -// }}} - -@implementation PreviewWindow (Private) -- (BOOL) updateOrShowError { - NSError *error = nil; - if (![previewer updateWithError:&error]) { - GtkWindow *dparent = gtk_widget_get_visible (GTK_WIDGET (window)) - ? window - : parent; - GtkWidget *dialog = gtk_message_dialog_new (dparent, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "Failed to generate the preview: %s", - [[error localizedDescription] UTF8String]); -#if GTK_CHECK_VERSION(2,22,0) - if ([error code] == TZ_ERR_TOOL_FAILED) { - GtkBox *box = GTK_BOX (gtk_message_dialog_get_message_area (GTK_MESSAGE_DIALOG (dialog))); - GtkWidget *label = gtk_label_new ("pdflatex said:"); - gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5f); - gtk_widget_show (label); - gtk_box_pack_start (box, label, FALSE, TRUE, 0); - - GtkWidget *view = gtk_text_view_new (); - GtkTextBuffer *buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - gtk_text_buffer_set_text (buffer, [[error toolOutput] UTF8String], -1); - gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE); - gtk_widget_show (view); - GtkWidget *scrolledView = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledView), - GTK_POLICY_NEVER, // horiz - GTK_POLICY_ALWAYS); // vert - gtk_widget_set_size_request (scrolledView, -1, 120); - gtk_container_add (GTK_CONTAINER (scrolledView), view); - gtk_widget_show (scrolledView); - gtk_box_pack_start (box, scrolledView, TRUE, TRUE, 0); - } -#endif // GTK+ 2.22.0 - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - return NO; - } - return YES; -} - -- (void) updateDefaultSize { - double width = 150; - double height = 150; - if ([previewer isValid]) { - double pWidth = [previewer width]; - double pHeight = [previewer height]; - width = (width < pWidth + 4) ? pWidth + 4 : width; - height = (height < pHeight + 4) ? pHeight + 4 : height; - } - gtk_window_set_default_size (window, width, height); -} -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PropertiesPane.h b/tikzit/src/gtk/PropertiesPane.h deleted file mode 100644 index c76efae..0000000 --- a/tikzit/src/gtk/PropertiesPane.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class EdgePropertyDelegate; -@class EdgeStylesModel; -@class GraphPropertyDelegate; -@class NodePropertyDelegate; -@class NodeStylesModel; -@class PropertyListEditor; -@class StyleManager; -@class TikzDocument; - -@interface PropertiesPane: NSObject { - TikzDocument *document; - BOOL blockUpdates; - - PropertyListEditor *graphProps; - PropertyListEditor *nodeProps; - PropertyListEditor *edgeProps; - PropertyListEditor *edgeNodeProps; - - GraphPropertyDelegate *graphPropDelegate; - NodePropertyDelegate *nodePropDelegate; - EdgePropertyDelegate *edgePropDelegate; - - GtkWidget *layout; - - GtkWidget *currentPropsWidget; // no ref! - - GtkWidget *graphPropsWidget; - GtkWidget *nodePropsWidget; - GtkWidget *edgePropsWidget; - - GtkEntry *nodeLabelEntry; - GtkToggleButton *edgeNodeToggle; - GtkWidget *edgeNodePropsWidget; - GtkEntry *edgeNodeLabelEntry; - GtkEntry *edgeSourceAnchorEntry; - GtkEntry *edgeTargetAnchorEntry; -} - -@property (retain) TikzDocument *document; -@property (assign) BOOL visible; -@property (readonly) GtkWidget *gtkWidget; - -- (void) loadConfiguration:(Configuration*)config; -- (void) saveConfiguration:(Configuration*)config; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/PropertiesPane.m b/tikzit/src/gtk/PropertiesPane.m deleted file mode 100644 index ba43298..0000000 --- a/tikzit/src/gtk/PropertiesPane.m +++ /dev/null @@ -1,763 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "PropertiesPane.h" - -#import "GraphElementProperty.h" -#import "PropertyListEditor.h" -#import "TikzDocument.h" - -#import "gtkhelpers.h" - -// {{{ Internal interfaces -// {{{ GTK+ helpers -static GtkWidget *createLabelledEntry (const gchar *labelText, GtkEntry **entry); -static GtkWidget *createPropsPaneWithLabelEntry (PropertyListEditor *props, GtkEntry **labelEntry); -static GtkWidget *createBoldLabel (const gchar *text); -// }}} -// {{{ GTK+ callbacks -static void node_label_changed_cb (GtkEditable *widget, PropertiesPane *pane); -static void edge_node_label_changed_cb (GtkEditable *widget, PropertiesPane *pane); -static void edge_node_toggled_cb (GtkToggleButton *widget, PropertiesPane *pane); -static void edge_source_anchor_changed_cb (GtkEditable *widget, PropertiesPane *pane); -static void edge_target_anchor_changed_cb (GtkEditable *widget, PropertiesPane *pane); -// }}} - -@interface PropertiesPane (Notifications) -- (void) nodeSelectionChanged:(NSNotification*)n; -- (void) edgeSelectionChanged:(NSNotification*)n; -- (void) graphChanged:(NSNotification*)n; -- (void) nodeLabelEdited:(NSString*)newValue; -- (void) edgeNodeLabelEdited:(NSString*)newValue; -- (void) edgeNodeToggled:(BOOL)newValue; -- (BOOL) edgeSourceAnchorEdited:(NSString*)newValue; -- (BOOL) edgeTargetAnchorEdited:(NSString*)newValue; -@end - -@interface PropertiesPane (Private) -- (void) _updatePane; -- (void) _setDisplayedWidget:(GtkWidget*)widget; -@end - -// {{{ Delegates - -@interface GraphPropertyDelegate : NSObject<PropertyChangeDelegate> { - TikzDocument *doc; -} -- (void) setDocument:(TikzDocument*)d; -@end - -@interface NodePropertyDelegate : NSObject<PropertyChangeDelegate> { - TikzDocument *doc; - Node *node; -} -- (void) setDocument:(TikzDocument*)d; -- (void) setNode:(Node*)n; -@end - -@interface EdgePropertyDelegate : NSObject<PropertyChangeDelegate> { - TikzDocument *doc; - Edge *edge; -} -- (void) setDocument:(TikzDocument*)d; -- (void) setEdge:(Edge*)e; -@end - -// }}} - -// }}} -// {{{ API - -@implementation PropertiesPane - -- (id) init { - self = [super init]; - - if (self) { - document = nil; - blockUpdates = NO; - - graphProps = [[PropertyListEditor alloc] init]; - graphPropDelegate = [[GraphPropertyDelegate alloc] init]; - [graphProps setDelegate:graphPropDelegate]; - - nodeProps = [[PropertyListEditor alloc] init]; - nodePropDelegate = [[NodePropertyDelegate alloc] init]; - [nodeProps setDelegate:nodePropDelegate]; - - edgeProps = [[PropertyListEditor alloc] init]; - edgePropDelegate = [[EdgePropertyDelegate alloc] init]; - [edgeProps setDelegate:edgePropDelegate]; - - edgeNodeProps = [[PropertyListEditor alloc] init]; - [edgeNodeProps setDelegate:edgePropDelegate]; - - layout = gtk_vbox_new (FALSE, 0); - g_object_ref_sink (layout); - gtk_widget_show (layout); - - /* - * Graph properties - */ - graphPropsWidget = gtk_vbox_new (FALSE, 6); - g_object_ref_sink (graphPropsWidget); - gtk_widget_show (graphPropsWidget); - - GtkWidget *label = createBoldLabel ("Graph properties"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (graphPropsWidget), - label, - FALSE, FALSE, 0); - - gtk_widget_show ([graphProps widget]); - gtk_box_pack_start (GTK_BOX (graphPropsWidget), - [graphProps widget], - TRUE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (layout), - graphPropsWidget, - TRUE, TRUE, 0); - - - /* - * Node properties - */ - nodePropsWidget = gtk_vbox_new (FALSE, 6); - g_object_ref_sink (nodePropsWidget); - gtk_box_pack_start (GTK_BOX (layout), - nodePropsWidget, - TRUE, TRUE, 0); - - label = createBoldLabel ("Node properties"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (nodePropsWidget), - label, - FALSE, FALSE, 0); - - GtkWidget *labelWidget = createLabelledEntry ("Label", &nodeLabelEntry); - gtk_widget_show (labelWidget); - gtk_box_pack_start (GTK_BOX (nodePropsWidget), - labelWidget, - FALSE, FALSE, 0); - - gtk_widget_show ([nodeProps widget]); - gtk_box_pack_start (GTK_BOX (nodePropsWidget), - [nodeProps widget], - TRUE, TRUE, 0); - - g_signal_connect (G_OBJECT (nodeLabelEntry), - "changed", - G_CALLBACK (node_label_changed_cb), - self); - - /* - * Edge properties - */ - edgePropsWidget = gtk_vbox_new (FALSE, 6); - g_object_ref_sink (edgePropsWidget); - gtk_box_pack_start (GTK_BOX (layout), - edgePropsWidget, - TRUE, TRUE, 0); - - label = createBoldLabel ("Edge properties"); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - label, - FALSE, FALSE, 0); - - gtk_widget_show ([edgeProps widget]); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - [edgeProps widget], - TRUE, TRUE, 0); - - GtkWidget *split = gtk_hseparator_new (); - gtk_widget_show (split); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - split, - FALSE, FALSE, 0); - - GtkWidget *anchorTable = gtk_table_new (2, 2, FALSE); - - label = gtk_label_new ("Source anchor:"); - gtk_table_attach_defaults (GTK_TABLE (anchorTable), label, - 0, 1, 0, 1); - edgeSourceAnchorEntry = GTK_ENTRY (gtk_entry_new ()); - g_object_ref_sink (edgeSourceAnchorEntry); - gtk_table_attach_defaults (GTK_TABLE (anchorTable), - GTK_WIDGET (edgeSourceAnchorEntry), - 1, 2, 0, 1); - g_signal_connect (G_OBJECT (edgeSourceAnchorEntry), - "changed", - G_CALLBACK (edge_source_anchor_changed_cb), - self); - - label = gtk_label_new ("Target anchor:"); - gtk_table_attach_defaults (GTK_TABLE (anchorTable), label, - 0, 1, 1, 2); - edgeTargetAnchorEntry = GTK_ENTRY (gtk_entry_new ()); - g_object_ref_sink (edgeTargetAnchorEntry); - gtk_table_attach_defaults (GTK_TABLE (anchorTable), - GTK_WIDGET (edgeTargetAnchorEntry), - 1, 2, 1, 2); - g_signal_connect (G_OBJECT (edgeTargetAnchorEntry), - "changed", - G_CALLBACK (edge_target_anchor_changed_cb), - self); - - gtk_widget_show_all (anchorTable); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - anchorTable, - FALSE, FALSE, 0); - - split = gtk_hseparator_new (); - gtk_widget_show (split); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - split, - FALSE, FALSE, 0); - - edgeNodeToggle = GTK_TOGGLE_BUTTON (gtk_check_button_new_with_label ("Child node")); - g_object_ref_sink (edgeNodeToggle); - gtk_widget_show (GTK_WIDGET (edgeNodeToggle)); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - GTK_WIDGET (edgeNodeToggle), - FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (GTK_WIDGET (edgeNodeToggle)), - "toggled", - G_CALLBACK (edge_node_toggled_cb), - self); - - edgeNodePropsWidget = createPropsPaneWithLabelEntry(edgeNodeProps, &edgeNodeLabelEntry); - g_object_ref_sink (edgeNodePropsWidget); - g_object_ref_sink (edgeNodeLabelEntry); - gtk_box_pack_start (GTK_BOX (edgePropsWidget), - edgeNodePropsWidget, - TRUE, TRUE, 0); - g_signal_connect (G_OBJECT (edgeNodeLabelEntry), - "changed", - G_CALLBACK (edge_node_label_changed_cb), - self); - - /* - * Misc setup - */ - - [self _setDisplayedWidget:graphPropsWidget]; - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (graphPropsWidget); - g_object_unref (nodePropsWidget); - g_object_unref (edgePropsWidget); - - g_object_unref (nodeLabelEntry); - g_object_unref (edgeNodeToggle); - g_object_unref (edgeNodePropsWidget); - g_object_unref (edgeNodeLabelEntry); - g_object_unref (edgeSourceAnchorEntry); - g_object_unref (edgeTargetAnchorEntry); - - g_object_unref (layout); - - [graphProps release]; - [nodeProps release]; - [edgeProps release]; - [edgeNodeProps release]; - - [graphPropDelegate release]; - [nodePropDelegate release]; - [edgePropDelegate release]; - - [document release]; - - [super dealloc]; -} - -- (TikzDocument*) document { - return document; -} - -- (void) setDocument:(TikzDocument*)doc { - if (document != nil) { - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:document]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:[document pickSupport]]; - } - - [doc retain]; - [document release]; - document = doc; - - [graphPropDelegate setDocument:doc]; - [nodePropDelegate setDocument:doc]; - [edgePropDelegate setDocument:doc]; - - if (doc != nil) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeSelectionChanged:) - name:@"NodeSelectionChanged" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeSelectionChanged:) - name:@"EdgeSelectionChanged" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(graphChanged:) - name:@"TikzChanged" object:doc]; - } - - [self _updatePane]; -} - -- (BOOL) visible { - return gtk_widget_get_visible (layout); -} - -- (void) setVisible:(BOOL)visible { - gtk_widget_set_visible (layout, visible); -} - -- (GtkWidget*) gtkWidget { - return layout; -} - -- (void) loadConfiguration:(Configuration*)config { -} - -- (void) saveConfiguration:(Configuration*)config { -} - -@end -// }}} -// {{{ Notifications - -@implementation PropertiesPane (Notifications) - -- (void) nodeSelectionChanged:(NSNotification*)n { - [self _updatePane]; -} - -- (void) edgeSelectionChanged:(NSNotification*)n { - [self _updatePane]; -} - -- (void) graphChanged:(NSNotification*)n { - [self _updatePane]; -} - -- (void) nodeLabelEdited:(NSString*)newValue { - if (blockUpdates) - return; - - NSSet *sel = [[document pickSupport] selectedNodes]; - if ([sel count] != 1) { - NSLog(@"Expected single node selected; got %lu", [sel count]); - return; - } - - if ([newValue isValidTikzPropertyNameOrValue]) { - Node *node = [sel anyObject]; - [document startModifyNode:node]; - [node setLabel:newValue]; - [document endModifyNode]; - } else { - widget_set_error (GTK_WIDGET (nodeLabelEntry)); - } -} - -- (void) edgeNodeLabelEdited:(NSString*)newValue { - if (blockUpdates) - return; - - NSSet *sel = [[document pickSupport] selectedEdges]; - if ([sel count] != 1) { - NSLog(@"Expected single edge selected; got %lu", [sel count]); - return; - } - - Edge *edge = [sel anyObject]; - if (![edge hasEdgeNode]) { - NSLog(@"Expected edge with edge node"); - return; - } - - if ([newValue isValidTikzPropertyNameOrValue]) { - [document startModifyEdge:edge]; - [[edge edgeNode] setLabel:newValue]; - [document endModifyEdge]; - } else { - widget_set_error (GTK_WIDGET (edgeNodeLabelEntry)); - } -} - -- (void) edgeNodeToggled:(BOOL)newValue { - if (blockUpdates) - return; - - NSSet *sel = [[document pickSupport] selectedEdges]; - if ([sel count] != 1) { - NSLog(@"Expected single edge selected; got %lu", [sel count]); - return; - } - - Edge *edge = [sel anyObject]; - - [document startModifyEdge:edge]; - [edge setHasEdgeNode:newValue]; - [document endModifyEdge]; -} - -- (BOOL) edgeSourceAnchorEdited:(NSString*)newValue { - if (blockUpdates) - return YES; - - NSSet *sel = [[document pickSupport] selectedEdges]; - if ([sel count] != 1) { - NSLog(@"Expected single edge selected; got %lu", [sel count]); - return YES; - } - - Edge *edge = [sel anyObject]; - if ([newValue isValidAnchor]) { - [document startModifyEdge:edge]; - [edge setSourceAnchor:newValue]; - [document endModifyEdge]; - return YES; - } else { - return NO; - } -} - -- (BOOL) edgeTargetAnchorEdited:(NSString*)newValue { - if (blockUpdates) - return YES; - - NSSet *sel = [[document pickSupport] selectedEdges]; - if ([sel count] != 1) { - NSLog(@"Expected single edge selected; got %lu", [sel count]); - return YES; - } - - Edge *edge = [sel anyObject]; - if ([newValue isValidAnchor]) { - [document startModifyEdge:edge]; - [edge setTargetAnchor:newValue]; - [document endModifyEdge]; - return YES; - } else { - return NO; - } -} - -@end -// }}} -// {{{ Private - -@implementation PropertiesPane (Private) - -- (void) _setDisplayedWidget:(GtkWidget*)widget { - if (currentPropsWidget != widget) { - if (currentPropsWidget) - gtk_widget_hide (currentPropsWidget); - currentPropsWidget = widget; - if (widget) - gtk_widget_show (widget); - } -} - -- (void) _updatePane { - blockUpdates = YES; - - BOOL editGraphProps = YES; - GraphElementData *data = [[document graph] data]; - [graphProps setData:data]; - - NSSet *nodeSel = [[document pickSupport] selectedNodes]; - if ([nodeSel count] == 1) { - Node *n = [nodeSel anyObject]; - [nodePropDelegate setNode:n]; - [nodeProps setData:[n data]]; - gtk_entry_set_text (nodeLabelEntry, [[n label] UTF8String]); - widget_clear_error (GTK_WIDGET (nodeLabelEntry)); - [self _setDisplayedWidget:nodePropsWidget]; - editGraphProps = NO; - } else { - [nodePropDelegate setNode:nil]; - [nodeProps setData:nil]; - gtk_entry_set_text (nodeLabelEntry, ""); - - NSSet *edgeSel = [[document pickSupport] selectedEdges]; - if ([edgeSel count] == 1) { - Edge *e = [edgeSel anyObject]; - [edgePropDelegate setEdge:e]; - [edgeProps setData:[e data]]; - gtk_entry_set_text (edgeSourceAnchorEntry, - [[e sourceAnchor] UTF8String]); - gtk_entry_set_text (edgeTargetAnchorEntry, - [[e targetAnchor] UTF8String]); - widget_clear_error (GTK_WIDGET (edgeSourceAnchorEntry)); - widget_clear_error (GTK_WIDGET (edgeTargetAnchorEntry)); - widget_clear_error (GTK_WIDGET (edgeNodeLabelEntry)); - if ([e hasEdgeNode]) { - gtk_toggle_button_set_active (edgeNodeToggle, TRUE); - gtk_widget_show (edgeNodePropsWidget); - gtk_entry_set_text (edgeNodeLabelEntry, [[[e edgeNode] label] UTF8String]); - [edgeNodeProps setData:[[e edgeNode] data]]; - gtk_widget_set_sensitive (edgeNodePropsWidget, TRUE); - } else { - gtk_toggle_button_set_active (edgeNodeToggle, FALSE); - gtk_widget_hide (edgeNodePropsWidget); - gtk_entry_set_text (edgeNodeLabelEntry, ""); - [edgeNodeProps setData:nil]; - gtk_widget_set_sensitive (edgeNodePropsWidget, FALSE); - } - [self _setDisplayedWidget:edgePropsWidget]; - editGraphProps = NO; - } else { - [edgePropDelegate setEdge:nil]; - [edgeProps setData:nil]; - [edgeNodeProps setData:nil]; - gtk_entry_set_text (edgeNodeLabelEntry, ""); - } - } - - if (editGraphProps) { - [self _setDisplayedWidget:graphPropsWidget]; - } - - blockUpdates = NO; -} - -@end - -// }}} -// {{{ Delegates - -@implementation GraphPropertyDelegate -- (id) init { - self = [super init]; - if (self) { - doc = nil; - } - return self; -} -- (void) dealloc { - // doc is not retained - [super dealloc]; -} -- (void) setDocument:(TikzDocument*)d { - doc = d; -} -- (BOOL)startEdit { - if ([doc graph] != nil) { - [doc startChangeGraphProperties]; - return YES; - } - return NO; -} -- (void)endEdit { - [doc endChangeGraphProperties]; -} -- (void)cancelEdit { - [doc cancelChangeGraphProperties]; -} -@end - -@implementation NodePropertyDelegate -- (id) init { - self = [super init]; - if (self) { - doc = nil; - node = nil; - } - return self; -} -- (void) dealloc { - // doc,node not retained - [super dealloc]; -} -- (void) setDocument:(TikzDocument*)d { - doc = d; - node = nil; -} -- (void) setNode:(Node*)n { - node = n; -} -- (BOOL)startEdit { - if (node != nil) { - [doc startModifyNode:node]; - return YES; - } - return NO; -} -- (void)endEdit { - [doc endModifyNode]; -} -- (void)cancelEdit { - [doc cancelModifyNode]; -} -@end - -@implementation EdgePropertyDelegate -- (id) init { - self = [super init]; - if (self) { - doc = nil; - edge = nil; - } - return self; -} -- (void) dealloc { - // doc,edge not retained - [super dealloc]; -} -- (void) setDocument:(TikzDocument*)d { - doc = d; - edge = nil; -} -- (void) setEdge:(Edge*)e { - edge = e; -} -- (BOOL)startEdit { - if (edge != nil) { - [doc startModifyEdge:edge]; - return YES; - } - return NO; -} -- (void)endEdit { - [doc endModifyEdge]; -} -- (void)cancelEdit { - [doc cancelModifyEdge]; -} -@end - -// }}} -// {{{ GTK+ helpers - -static GtkWidget *createLabelledEntry (const gchar *labelText, GtkEntry **entry) { - GtkBox *box = GTK_BOX (gtk_hbox_new (FALSE, 0)); - GtkWidget *label = gtk_label_new (labelText); - gtk_widget_show (label); - GtkWidget *entryWidget = gtk_entry_new (); - gtk_widget_show (entryWidget); - // container widget expand fill pad - gtk_box_pack_start (box, label, FALSE, TRUE, 5); - gtk_box_pack_start (box, entryWidget, TRUE, TRUE, 0); - if (entry) - *entry = GTK_ENTRY (entryWidget); - return GTK_WIDGET (box); -} - -static GtkWidget *createPropsPaneWithLabelEntry (PropertyListEditor *props, GtkEntry **labelEntry) { - GtkBox *box = GTK_BOX (gtk_vbox_new (FALSE, 6)); - - GtkWidget *labelWidget = createLabelledEntry ("Label", labelEntry); - gtk_widget_show (labelWidget); - // box widget expand fill pad - gtk_box_pack_start (box, labelWidget, FALSE, FALSE, 0); - gtk_box_pack_start (box, [props widget], TRUE, TRUE, 0); - gtk_widget_show ([props widget]); - return GTK_WIDGET (box); -} - -static GtkWidget *createBoldLabel (const gchar *text) { - GtkWidget *label = gtk_label_new (text); - label_set_bold (GTK_LABEL (label)); - return label; -} - -// }}} -// {{{ GTK+ callbacks - -static void node_label_changed_cb (GtkEditable *editable, PropertiesPane *pane) { - if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) { - // clearly wasn't the user editing - return; - } - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *newValue = gtk_editable_get_string (editable, 0, -1); - [pane nodeLabelEdited:newValue]; - - [pool drain]; -} - -static void edge_node_label_changed_cb (GtkEditable *editable, PropertiesPane *pane) { - if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) { - // clearly wasn't the user editing - return; - } - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *newValue = gtk_editable_get_string (editable, 0, -1); - [pane edgeNodeLabelEdited:newValue]; - - [pool drain]; -} - -static void edge_node_toggled_cb (GtkToggleButton *toggle, PropertiesPane *pane) { - if (!gtk_widget_is_sensitive (GTK_WIDGET (toggle))) { - // clearly wasn't the user editing - return; - } - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - gboolean newValue = gtk_toggle_button_get_active (toggle); - [pane edgeNodeToggled:newValue]; - - [pool drain]; -} - -static void edge_source_anchor_changed_cb (GtkEditable *editable, PropertiesPane *pane) { - if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) { - // clearly wasn't the user editing - return; - } - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *newValue = gtk_editable_get_string (editable, 0, -1); - if (![pane edgeSourceAnchorEdited:newValue]) - widget_set_error (GTK_WIDGET (editable)); - - [pool drain]; -} - -static void edge_target_anchor_changed_cb (GtkEditable *editable, PropertiesPane *pane) { - if (!gtk_widget_is_sensitive (GTK_WIDGET (editable))) { - // clearly wasn't the user editing - return; - } - - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *newValue = gtk_editable_get_string (editable, 0, -1); - if (![pane edgeTargetAnchorEdited:newValue]) - widget_set_error (GTK_WIDGET (editable)); - - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/PropertyListEditor.h b/tikzit/src/gtk/PropertyListEditor.h deleted file mode 100644 index 2d3166a..0000000 --- a/tikzit/src/gtk/PropertyListEditor.h +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> -#import "GraphElementData.h" -#import "GraphElementProperty.h" - -@protocol PropertyChangeDelegate -@optional -- (BOOL)startEdit; -- (void)endEdit; -- (void)cancelEdit; -@end - -@interface PropertyListEditor: NSObject { - GraphElementData *data; - NSObject<PropertyChangeDelegate> *delegate; - - GtkListStore *list; - GtkWidget *view; - GtkWidget *widget; - GtkWidget *removeButton; -} - -/*! - @property widget - @brief The widget displaying the editable list - */ -@property (readonly) GtkWidget *widget; - -/*! - @property data - @brief The GraphElementData that should be reflected in the list - */ -@property (retain) GraphElementData *data; - -/*! - @property delegate - @brief A delegate for dealing with property changes - */ -@property (retain) NSObject<PropertyChangeDelegate> *delegate; - -/*! - * Reload the properties from the data store - */ -- (void) reloadProperties; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/PropertyListEditor.m b/tikzit/src/gtk/PropertyListEditor.m deleted file mode 100644 index 9760618..0000000 --- a/tikzit/src/gtk/PropertyListEditor.m +++ /dev/null @@ -1,501 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "PropertyListEditor.h" -#import "gtkhelpers.h" - -// {{{ Constants - -enum { - PLM_NAME_COL = 0, - PLM_VALUE_COL, - PLM_IS_PROPERTY_COL, - PLM_PROPERTY_COL, - PLM_N_COLS -}; - -// }}} -// {{{ Internal interfaces -// {{{ Signals - -static void value_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PropertyListEditor *editor); -static void name_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PropertyListEditor *editor); -static void add_prop_clicked_cb (GtkButton *button, - PropertyListEditor *editor); -static void add_atom_clicked_cb (GtkButton *button, - PropertyListEditor *editor); -static void remove_clicked_cb (GtkButton *button, - PropertyListEditor *editor); -static void text_editing_started (GtkCellRenderer *cell, - GtkCellEditable *editable, - const gchar *path, - PropertyListEditor *editor); -static void text_changed_cb (GtkEditable *editable, - PropertyListEditor *pane); -static void selection_changed_cb (GtkTreeSelection *selection, - PropertyListEditor *pane); - -// }}} -// {{{ Private - -@interface PropertyListEditor (Private) -- (void) updatePath:(gchar*)path withValue:(NSString*)newText; -- (void) updatePath:(gchar*)path withName:(NSString*)newText; -- (void) addProperty; -- (void) addAtom; -- (void) removeSelected; -- (void) selectionCountChanged:(int)newSelectionCount; -- (void) clearStore; -@end - -// }}} -// }}} -// {{{ API - -@implementation PropertyListEditor - -- (id) init { - self = [super init]; - - if (self) { - list = gtk_list_store_new (PLM_N_COLS, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_BOOLEAN, - G_TYPE_POINTER); - g_object_ref_sink (G_OBJECT (list)); - view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (list)); - g_object_ref_sink (G_OBJECT (view)); - GtkWidget *scrolledview = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledview), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (scrolledview), view); - gtk_widget_set_size_request (view, -1, 150); - data = nil; - delegate = nil; - - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; - - renderer = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (renderer), - "editable", TRUE, - NULL); - column = gtk_tree_view_column_new_with_attributes ("Key/Atom", - renderer, - "text", PLM_NAME_COL, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); - g_signal_connect (G_OBJECT (renderer), - "editing-started", - G_CALLBACK (text_editing_started), - self); - g_signal_connect (G_OBJECT (renderer), - "edited", - G_CALLBACK (name_edited_cb), - self); - - renderer = gtk_cell_renderer_text_new (); - column = gtk_tree_view_column_new_with_attributes ("Value", - renderer, - "text", PLM_VALUE_COL, - "editable", PLM_IS_PROPERTY_COL, - "sensitive", PLM_IS_PROPERTY_COL, - NULL); - gtk_tree_view_append_column (GTK_TREE_VIEW (view), column); - g_signal_connect (G_OBJECT (renderer), - "edited", - G_CALLBACK (value_edited_cb), - self); - - widget = gtk_vbox_new (FALSE, 0); - gtk_box_set_spacing (GTK_BOX (widget), 6); - g_object_ref_sink (G_OBJECT (widget)); - - GtkWidget *listFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (listFrame), scrolledview); - gtk_widget_show (listFrame); - gtk_container_add (GTK_CONTAINER (widget), listFrame); - - GtkBox *buttonBox = GTK_BOX (gtk_hbox_new(FALSE, 0)); - gtk_box_pack_start (GTK_BOX (widget), GTK_WIDGET (buttonBox), FALSE, FALSE, 0); - - GtkWidget *addPropButton = gtk_button_new (); - //gtk_widget_set_size_request (addPropButton, 27, 27); - gtk_widget_set_tooltip_text (addPropButton, "Add property"); - GtkWidget *addPropContents = gtk_hbox_new(FALSE, 0); - GtkWidget *addPropIcon = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (addPropContents), addPropIcon); - gtk_container_add (GTK_CONTAINER (addPropContents), gtk_label_new ("P")); - gtk_container_add (GTK_CONTAINER (addPropButton), addPropContents); - gtk_box_pack_start (buttonBox, addPropButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (addPropButton), - "clicked", - G_CALLBACK (add_prop_clicked_cb), - self); - - GtkWidget *addAtomButton = gtk_button_new (); - //gtk_widget_set_size_request (addAtomButton, 27, 27); - gtk_widget_set_tooltip_text (addAtomButton, "Add atom"); - GtkWidget *addAtomContents = gtk_hbox_new(FALSE, 0); - GtkWidget *addAtomIcon = gtk_image_new_from_stock (GTK_STOCK_ADD, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (addAtomContents), addAtomIcon); - gtk_container_add (GTK_CONTAINER (addAtomContents), gtk_label_new ("A")); - gtk_container_add (GTK_CONTAINER (addAtomButton), addAtomContents); - gtk_box_pack_start (buttonBox, addAtomButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (addAtomButton), - "clicked", - G_CALLBACK (add_atom_clicked_cb), - self); - - removeButton = gtk_button_new (); - g_object_ref_sink (G_OBJECT (removeButton)); - gtk_widget_set_sensitive (removeButton, FALSE); - //gtk_widget_set_size_request (removeButton, 27, 27); - gtk_widget_set_tooltip_text (removeButton, "Remove selected"); - GtkWidget *removeIcon = gtk_image_new_from_stock (GTK_STOCK_REMOVE, GTK_ICON_SIZE_BUTTON); - gtk_container_add (GTK_CONTAINER (removeButton), removeIcon); - gtk_box_pack_start (buttonBox, removeButton, FALSE, FALSE, 0); - g_signal_connect (G_OBJECT (removeButton), - "clicked", - G_CALLBACK (remove_clicked_cb), - self); - - GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); - g_signal_connect (G_OBJECT (selection), - "changed", - G_CALLBACK (selection_changed_cb), - self); - - gtk_widget_show_all (GTK_WIDGET (buttonBox)); - gtk_widget_show_all (scrolledview); - - gtk_widget_set_sensitive (widget, FALSE); - } - - return self; -} - -- (void) dealloc { - [self clearStore]; - - [data release]; - [delegate release]; - - g_object_unref (list); - g_object_unref (view); - g_object_unref (widget); - g_object_unref (removeButton); - - [super dealloc]; -} - -@synthesize widget, delegate; - -- (GraphElementData*) data { return data; } -- (void) setData:(GraphElementData*)d { - [d retain]; - [data release]; - data = d; - [self reloadProperties]; - gtk_widget_set_sensitive (widget, data != nil); -} - -- (void) reloadProperties { - [self clearStore]; - int pos = 0; - for (GraphElementProperty *p in data) { - GtkTreeIter iter; - [p retain]; - gtk_list_store_insert_with_values (list, &iter, pos, - PLM_NAME_COL, [[p key] UTF8String], - PLM_VALUE_COL, [[p value] UTF8String], - PLM_IS_PROPERTY_COL, ![p isAtom], - PLM_PROPERTY_COL, (void *)p, - -1); - ++pos; - } -} - -@end - -// }}} -// {{{ Private - -@implementation PropertyListEditor (Private) -- (void) updatePath:(gchar*)pathStr withValue:(NSString*)newText { - if (![newText isValidTikzPropertyNameOrValue]) - return; - - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string (pathStr); - - if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (list), &iter, path)) { - gtk_tree_path_free (path); - return; - } - - void *propPtr; - gtk_tree_model_get (GTK_TREE_MODEL (list), &iter, - PLM_PROPERTY_COL, &propPtr, - -1); - GraphElementProperty *prop = (GraphElementProperty*)propPtr; - - if (![prop isAtom]) { - if (![delegate respondsToSelector:@selector(startEdit)] || [delegate startEdit]) { - [prop setValue:newText]; - gtk_list_store_set (list, &iter, - PLM_VALUE_COL, [newText UTF8String], - -1); - [delegate endEdit]; - } - } - - gtk_tree_path_free (path); -} - -- (void) updatePath:(gchar*)pathStr withName:(NSString*)newText { - if (![newText isValidTikzPropertyNameOrValue]) - return; - - GtkTreeIter iter; - GtkTreePath *path = gtk_tree_path_new_from_string (pathStr); - - if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (list), &iter, path)) { - gtk_tree_path_free (path); - return; - } - - void *propPtr; - gtk_tree_model_get (GTK_TREE_MODEL (list), &iter, - PLM_PROPERTY_COL, &propPtr, - -1); - GraphElementProperty *prop = (GraphElementProperty*)propPtr; - - if (![delegate respondsToSelector:@selector(startEdit)] || [delegate startEdit]) { - if ([newText isEqualToString:@""]) { - [data removeObjectIdenticalTo:prop]; - gtk_list_store_remove (list, &iter); - [prop release]; - } else { - [prop setKey:newText]; - gtk_list_store_set (list, &iter, - PLM_NAME_COL, [newText UTF8String], - -1); - } - [delegate endEdit]; - } - - gtk_tree_path_free (path); -} - -- (void) addProperty { - GtkTreeIter iter; - GraphElementProperty *p = [[GraphElementProperty alloc] initWithPropertyValue:@"" forKey:@"new property"]; - if (![delegate respondsToSelector:@selector(startEdit)] || [delegate startEdit]) { - [data addObject:p]; - gint pos = [data count] - 1; - gtk_list_store_insert_with_values (list, &iter, pos, - PLM_NAME_COL, "new property", - PLM_VALUE_COL, "", - PLM_IS_PROPERTY_COL, TRUE, - PLM_PROPERTY_COL, (void *)p, - -1); - [delegate endEdit]; - } else { - [p release]; - } -} - -- (void) addAtom { - GtkTreeIter iter; - GraphElementProperty *p = [[GraphElementProperty alloc] initWithAtomName:@"new atom"]; - if (![delegate respondsToSelector:@selector(startEdit)] || [delegate startEdit]) { - [data addObject:p]; - gint pos = [data count] - 1; - gtk_list_store_insert_with_values (list, &iter, pos, - PLM_NAME_COL, "new atom", - PLM_VALUE_COL, [[p value] UTF8String], - PLM_IS_PROPERTY_COL, FALSE, - PLM_PROPERTY_COL, (void *)p, - -1); - [delegate endEdit]; - } else { - [p release]; - } -} - -- (void) removeSelected { - GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view)); - GList *selPaths = gtk_tree_selection_get_selected_rows (selection, NULL); - GList *selIters = NULL; - - // Convert to iters, as GtkListStore has persistent iters - GList *curr = selPaths; - while (curr != NULL) { - GtkTreeIter iter; - gtk_tree_model_get_iter (GTK_TREE_MODEL (list), - &iter, - (GtkTreePath*)curr->data); - selIters = g_list_prepend (selIters, gtk_tree_iter_copy (&iter)); - curr = g_list_next (curr); - } - - // remove all iters - curr = selIters; - while (curr != NULL) { - GtkTreeIter *iter = (GtkTreeIter*)curr->data; - void *propPtr; - gtk_tree_model_get (GTK_TREE_MODEL (list), iter, - PLM_PROPERTY_COL, &propPtr, - -1); - GraphElementProperty *prop = (GraphElementProperty*)propPtr; - if (![delegate respondsToSelector:@selector(startEdit)] || [delegate startEdit]) { - [data removeObjectIdenticalTo:prop]; - gtk_list_store_remove (list, iter); - [prop release]; - [delegate endEdit]; - } - curr = g_list_next (curr); - } - - g_list_foreach (selIters, (GFunc) gtk_tree_iter_free, NULL); - g_list_free (selIters); - g_list_foreach (selPaths, (GFunc) gtk_tree_path_free, NULL); - g_list_free (selPaths); -} - -- (void) selectionCountChanged:(int)count { - gtk_widget_set_sensitive (removeButton, count > 0); -} - -- (void) clearStore { - GtkTreeIter iter; - if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (list), &iter)) { - do { - void *prop; - gtk_tree_model_get (GTK_TREE_MODEL (list), &iter, - PLM_PROPERTY_COL, &prop, - -1); - [(id)prop release]; - } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (list), &iter)); - gtk_list_store_clear (list); - } -} -@end - -// }}} -// {{{ GTK+ callbacks - -static void value_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor updatePath:path withValue:[NSString stringWithUTF8String:new_text]]; - [pool drain]; -} - -static void name_edited_cb (GtkCellRendererText *renderer, - gchar *path, - gchar *new_text, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor updatePath:path withName:[NSString stringWithUTF8String:new_text]]; - [pool drain]; -} - -static void add_prop_clicked_cb (GtkButton *button, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor addProperty]; - [pool drain]; -} - -static void add_atom_clicked_cb (GtkButton *button, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor addAtom]; - [pool drain]; -} - -static void remove_clicked_cb (GtkButton *button, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [editor removeSelected]; - [pool drain]; -} - -static void text_editing_started (GtkCellRenderer *cell, - GtkCellEditable *editable, - const gchar *path, - PropertyListEditor *editor) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if (GTK_IS_EDITABLE (editable) && GTK_IS_WIDGET (editable)) { - g_signal_handlers_disconnect_by_func (G_OBJECT (editable), - G_CALLBACK (text_changed_cb), - editor); - widget_clear_error (GTK_WIDGET (editable)); - g_signal_connect (G_OBJECT (editable), - "changed", - G_CALLBACK (text_changed_cb), - editor); - } - - [pool drain]; -} - -static void text_changed_cb (GtkEditable *editable, PropertyListEditor *pane) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - NSString *newValue = gtk_editable_get_string (editable, 0, -1); - if (![newValue isValidTikzPropertyNameOrValue]) { - widget_set_error (GTK_WIDGET (editable)); - } else { - widget_clear_error (GTK_WIDGET (editable)); - } - - [pool drain]; -} - -static void selection_changed_cb (GtkTreeSelection *selection, - PropertyListEditor *pane) -{ - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - int selcount = gtk_tree_selection_count_selected_rows (selection); - [pane selectionCountChanged:selcount]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/RecentManager.h b/tikzit/src/gtk/RecentManager.h deleted file mode 100644 index e2c2793..0000000 --- a/tikzit/src/gtk/RecentManager.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" - -@interface RecentManager: NSObject { -} - -+ (RecentManager*) defaultManager; - -- (void)addRecentFile:(NSString*)path; -- (void)removeRecentFile:(NSString*)path; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/RecentManager.m b/tikzit/src/gtk/RecentManager.m deleted file mode 100644 index c6074c6..0000000 --- a/tikzit/src/gtk/RecentManager.m +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "RecentManager.h" -#import <gtk/gtk.h> - -static RecentManager *defMan = nil; - -@implementation RecentManager -- (id) init { - self = [super init]; - return self; -} - -+ (RecentManager*) defaultManager { - if (defMan == nil) { - defMan = [[self alloc] init]; - } - return defMan; -} - -- (void)addRecentFile:(NSString*)path { - NSError *error = nil; - gchar *uri = [path glibUriWithError:&error]; - if (error) { - logError (error, @"Could not add recent file"); - return; - } - - GtkRecentData recent_data; - recent_data.display_name = NULL; - recent_data.description = NULL; - recent_data.mime_type = "text/x-tikz"; - recent_data.app_name = (gchar *) g_get_application_name (); - recent_data.app_exec = g_strjoin (" ", g_get_prgname (), "%u", NULL); - recent_data.groups = NULL; - recent_data.is_private = FALSE; - - gtk_recent_manager_add_full (gtk_recent_manager_get_default(), uri, &recent_data); - - g_free (uri); - g_free (recent_data.app_exec); -} - -- (void)removeRecentFile:(NSString*)path { - NSError *error = nil; - gchar *uri = [path glibUriWithError:&error]; - if (error) { - logError (error, @"Could not remove recent file"); - return; - } - - gtk_recent_manager_remove_item (gtk_recent_manager_get_default(), uri, NULL); - - g_free (uri); -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/SelectTool.h b/tikzit/src/gtk/SelectTool.h deleted file mode 100644 index 65f511a..0000000 --- a/tikzit/src/gtk/SelectTool.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Tool.h" - -@class Edge; -@class Node; - -// FIXME: replace this with delegates -typedef enum { - QuietState, - SelectBoxState, - ToggleSelectState, - MoveSelectedNodesState, - DragEdgeControlPoint1, - DragEdgeControlPoint2 -} SelectToolState; - -typedef enum { - DragSelectsNodes = 1, - DragSelectsEdges = 2, - DragSelectsBoth = DragSelectsNodes | DragSelectsEdges -} DragSelectMode; - -@interface SelectTool : NSObject <Tool> { - GraphRenderer *renderer; - SelectToolState state; - float edgeFuzz; - DragSelectMode dragSelectMode; - NSPoint dragOrigin; - Node *leaderNode; - NSPoint oldLeaderPos; - Edge *modifyEdge; - NSRect selectionBox; - NSMutableSet *selectionBoxContents; - - GtkWidget *configWidget; - GSList *dragSelectModeButtons; -} - -@property (assign) float edgeFuzz; -@property (assign) DragSelectMode dragSelectMode; - -- (id) init; -+ (id) tool; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/SelectTool.m b/tikzit/src/gtk/SelectTool.m deleted file mode 100644 index b3121ae..0000000 --- a/tikzit/src/gtk/SelectTool.m +++ /dev/null @@ -1,590 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "SelectTool.h" - -#import "Configuration.h" -#import "Edge+Render.h" -#import "GraphRenderer.h" -#import "TikzDocument.h" -#import "tzstockitems.h" - -#import <gdk/gdkkeysyms.h> - -#define DRAG_SELECT_MODE_KEY "tikzit-drag-select-mode" - -static const InputMask unionSelectMask = ShiftMask; - -static void drag_select_mode_cb (GtkToggleButton *button, SelectTool *tool); - -@interface SelectTool (Private) -- (TikzDocument*) doc; -- (void) shiftNodesByMovingLeader:(Node*)leader to:(NSPoint)to; -- (void) deselectAllNodes; -- (void) deselectAllEdges; -- (void) deselectAll; -- (BOOL) circleWithCenter:(NSPoint)c andRadius:(float)r containsPoint:(NSPoint)p; -- (void) lookForControlPointAt:(NSPoint)pos; -- (void) setSelectionBox:(NSRect)box; -- (void) clearSelectionBox; -- (BOOL) selectionBoxContainsNode:(Node*)node; -@end - -@implementation SelectTool -- (NSString*) name { return @"Select"; } -- (const gchar*) stockId { return TIKZIT_STOCK_SELECT; } -- (NSString*) helpText { return @"Select, move and edit nodes and edges"; } -- (NSString*) shortcut { return @"s"; } -@synthesize configurationWidget=configWidget; -@synthesize edgeFuzz; - -+ (id) tool { - return [[[self alloc] init] autorelease]; -} - -- (id) init { - self = [super init]; - - if (self) { - state = QuietState; - edgeFuzz = 3.0f; - dragSelectMode = DragSelectsNodes; - - configWidget = gtk_vbox_new (FALSE, 0); - g_object_ref_sink (configWidget); - - GtkWidget *label = gtk_label_new ("Drag selects:"); - gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (configWidget), - label, - FALSE, - FALSE, - 0); - - GtkWidget *nodeOpt = gtk_radio_button_new_with_label (NULL, "nodes (N)"); - g_object_set_data (G_OBJECT (nodeOpt), - DRAG_SELECT_MODE_KEY, - (gpointer)DragSelectsNodes); - gtk_box_pack_start (GTK_BOX (configWidget), - nodeOpt, - FALSE, - FALSE, - 0); - g_signal_connect (G_OBJECT (nodeOpt), - "toggled", - G_CALLBACK (drag_select_mode_cb), - self); - - GtkWidget *edgeOpt = gtk_radio_button_new_with_label ( - gtk_radio_button_get_group (GTK_RADIO_BUTTON (nodeOpt)), - "edges (E)"); - g_object_set_data (G_OBJECT (edgeOpt), - DRAG_SELECT_MODE_KEY, - (gpointer)DragSelectsEdges); - gtk_box_pack_start (GTK_BOX (configWidget), - edgeOpt, - FALSE, - FALSE, - 0); - g_signal_connect (G_OBJECT (edgeOpt), - "toggled", - G_CALLBACK (drag_select_mode_cb), - self); - - GtkWidget *bothOpt = gtk_radio_button_new_with_label ( - gtk_radio_button_get_group (GTK_RADIO_BUTTON (edgeOpt)), - "both (B)"); - g_object_set_data (G_OBJECT (bothOpt), - DRAG_SELECT_MODE_KEY, - (gpointer)DragSelectsBoth); - gtk_box_pack_start (GTK_BOX (configWidget), - bothOpt, - FALSE, - FALSE, - 0); - g_signal_connect (G_OBJECT (bothOpt), - "toggled", - G_CALLBACK (drag_select_mode_cb), - self); - dragSelectModeButtons = gtk_radio_button_get_group (GTK_RADIO_BUTTON (bothOpt)); - - gtk_widget_show_all (configWidget); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [renderer release]; - [leaderNode release]; - [modifyEdge release]; - - g_object_unref (G_OBJECT (configWidget)); - - [super dealloc]; -} - -- (DragSelectMode) dragSelectMode { - return dragSelectMode; -} - -- (void) setDragSelectMode:(DragSelectMode)mode { - if (dragSelectMode == mode) - return; - - dragSelectMode = mode; - - GSList *entry = dragSelectModeButtons; - while (entry) { - GtkToggleButton *button = GTK_TOGGLE_BUTTON (entry->data); - DragSelectMode buttonMode = - (DragSelectMode) g_object_get_data ( - G_OBJECT (button), - DRAG_SELECT_MODE_KEY); - if (buttonMode == dragSelectMode) { - gtk_toggle_button_set_active (button, TRUE); - break; - } - - entry = g_slist_next (entry); - } -} - -- (GraphRenderer*) activeRenderer { return renderer; } -- (void) setActiveRenderer:(GraphRenderer*)r { - if (r == renderer) - return; - - [r retain]; - [renderer release]; - renderer = r; - - state = QuietState; -} - -- (void) mousePressAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - dragOrigin = pos; - - // we should already be in a quiet state, but no harm in making sure - state = QuietState; - - modifyEdge = nil; - [self lookForControlPointAt:pos]; - - if (modifyEdge == nil) { - // we didn't find a control point - - BOOL unionSelect = (mask & unionSelectMask); - - leaderNode = [renderer anyNodeAt:pos]; - // if we hit a node, deselect other nodes (if Shift is up) and go to move mode - if (leaderNode != nil) { - BOOL alreadySelected = [[self doc] isNodeSelected:leaderNode]; - if (!unionSelect && !alreadySelected) { - [self deselectAll]; - } - if (unionSelect && alreadySelected) { - state = ToggleSelectState; - } else { - [[[self doc] pickSupport] selectNode:leaderNode]; - state = MoveSelectedNodesState; - oldLeaderPos = [leaderNode point]; - [[self doc] startShiftNodes:[[[self doc] pickSupport] selectedNodes]]; - } - } - - // if mouse did not hit a node, check if mouse hit an edge - if (leaderNode == nil) { - Edge *edge = [renderer anyEdgeAt:pos withFuzz:edgeFuzz]; - if (edge != nil) { - BOOL alreadySelected = [[self doc] isEdgeSelected:edge]; - if (!unionSelect) { - [self deselectAll]; - } - if (unionSelect && alreadySelected) { - [[[self doc] pickSupport] deselectEdge:edge]; - } else { - [[[self doc] pickSupport] selectEdge:edge]; - } - } else { - // if mouse did not hit anything, put us in box mode - if (!unionSelect) { - [self deselectAll]; - } - [renderer clearHighlightedNodes]; - state = SelectBoxState; - } - } - } -} - -- (void) mouseMoveTo:(NSPoint)pos withButtons:(MouseButton)buttons andMask:(InputMask)mask { - if (!(buttons & LeftButton)) - return; - - Transformer *transformer = [renderer transformer]; - - if (state == ToggleSelectState) { - state = MoveSelectedNodesState; - oldLeaderPos = [leaderNode point]; - [[self doc] startShiftNodes:[[[self doc] pickSupport] selectedNodes]]; - } - - if (state == SelectBoxState) { - [self setSelectionBox:NSRectAroundPoints(dragOrigin, pos)]; - - NSEnumerator *enumerator = [[self doc] nodeEnumerator]; - Node *node; - while ((node = [enumerator nextObject]) != nil) { - NSPoint nodePos = [transformer toScreen:[node point]]; - if (NSPointInRect(nodePos, selectionBox)) { - [renderer setNode:node highlighted:YES]; - } else { - [renderer setNode:node highlighted:NO]; - } - } - } else if (state == MoveSelectedNodesState) { - if (leaderNode != nil) { - [self shiftNodesByMovingLeader:leaderNode to:pos]; - NSPoint shiftSoFar; - shiftSoFar.x = [leaderNode point].x - oldLeaderPos.x; - shiftSoFar.y = [leaderNode point].y - oldLeaderPos.y; - [[self doc] shiftNodesUpdate:shiftSoFar]; - } - } else if (state == DragEdgeControlPoint1 || state == DragEdgeControlPoint2) { - // invalidate once before we start changing it: we may be shrinking - // the control circles - [[self doc] modifyEdgeCheckPoint]; - if (state == DragEdgeControlPoint1) { - [modifyEdge moveCp1To:[transformer fromScreen:pos] - withWeightCourseness:0.1f - andBendCourseness:15 - forceLinkControlPoints:(mask & ControlMask)]; - } else { - [modifyEdge moveCp2To:[transformer fromScreen:pos] - withWeightCourseness:0.1f - andBendCourseness:15 - forceLinkControlPoints:(mask & ControlMask)]; - } - [[self doc] modifyEdgeCheckPoint]; - } -} - -- (void) mouseReleaseAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - if (state == SelectBoxState) { - PickSupport *ps = [[self doc] pickSupport]; - Transformer *transformer = [renderer transformer]; - - if (!(mask & unionSelectMask)) { - [ps deselectAllNodes]; - [ps deselectAllEdges]; - } - - Graph *graph = [[self doc] graph]; - if (dragSelectMode & DragSelectsNodes) { - for (Node *node in [graph nodes]) { - NSPoint nodePos = [transformer toScreen:[node point]]; - if (NSPointInRect(nodePos, selectionBox)) { - [ps selectNode:node]; - } - } - } - if (dragSelectMode & DragSelectsEdges) { - for (Edge *edge in [graph edges]) { - NSPoint edgePos = [transformer toScreen:[edge mid]]; - if (NSPointInRect(edgePos, selectionBox)) { - [ps selectEdge:edge]; - } - } - } - - [self clearSelectionBox]; - } else if (state == ToggleSelectState) { - [[[self doc] pickSupport] deselectNode:leaderNode]; - leaderNode = nil; - } else if (state == MoveSelectedNodesState) { - if (NSEqualPoints (oldLeaderPos, [leaderNode point])) { - [[self doc] cancelShiftNodes]; - } else { - [[self doc] endShiftNodes]; - } - leaderNode = nil; - } else if (state == DragEdgeControlPoint1 || state == DragEdgeControlPoint2) { - // FIXME: check if there was any real change - [[self doc] endModifyEdge]; - } - - state = QuietState; -} - -- (void) mouseDoubleClickAt:(NSPoint)pos withButton:(MouseButton)button andMask:(InputMask)mask { - if (button != LeftButton) - return; - - if (state != QuietState) { - return; - } - // convert bend mode on edge under mouse cursor - Edge *edge = [renderer anyEdgeAt:pos withFuzz:edgeFuzz]; - if (edge != nil) { - [[self doc] startModifyEdge:edge]; - if ([edge bendMode]==EdgeBendModeBasic) { - [edge convertBendToAngles]; - [edge setBendMode:EdgeBendModeInOut]; - } else { - [edge setBendMode:EdgeBendModeBasic]; - } - [[self doc] endModifyEdge]; - - [self deselectAllEdges]; - [[[self doc] pickSupport] selectEdge:edge]; - } -} - -- (void) keyPressed:(unsigned int)keyVal withMask:(InputMask)mask { - if (keyVal == GDK_KEY_N && mask == ShiftMask) { - [self setDragSelectMode:DragSelectsNodes]; - } else if (keyVal == GDK_KEY_E && mask == ShiftMask) { - [self setDragSelectMode:DragSelectsEdges]; - } else if (keyVal == GDK_KEY_B && mask == ShiftMask) { - [self setDragSelectMode:DragSelectsBoth]; - } else if (keyVal == GDK_KEY_D && (!mask || mask == ShiftMask)) { - PickSupport *ps = [[self doc] pickSupport]; - for (Node* node in [ps selectedNodes]) { - NSRect b = [node boundingRect]; - NSLog(@"%@ @ (%f,%f) {style=%@, label=%@, data=%@, bounds=(%f,%f),(%fx%f)}", - [node name], - [node point].x, - [node point].y, - [[node style] name], - [node label], - [[node data] tikzList], - b.origin.x, b.origin.y, b.size.width, b.size.height); - } - for (Edge* edge in [ps selectedEdges]) { - NSRect b = [edge boundingRect]; - NSLog(@"%@:%@->%@:%@ {\n" - @" style=%@, data=%@,\n" - @" bend=%d, weight=%f, inAngle=%d, outAngle=%d, bendMode=%d,\n" - @" head=(%f,%f), headTan=(%f,%f) leftHeadNormal=(%f,%f), rightHeadNormal=(%f,%f),\n" - @" cp1=(%f,%f),\n" - @" mid=(%f,%f), midTan=(%f,%f), leftNormal=(%f,%f), rightNormal=(%f,%f)\n" - @" cp2=(%f,%f),\n" - @" tail=(%f,%f), tailTan=(%f,%f), leftTailNormal=(%f,%f), rightTailNormal=(%f,%f),\n" - @" isSelfLoop=%s, isStraight=%s,\n" - @" bounds=(%f,%f),(%fx%f)\n" - @"}", - [[edge source] name], - [edge sourceAnchor], - [[edge target] name], - [edge targetAnchor], - [[edge style] name], - [[edge data] tikzList], - [edge bend], - [edge weight], - [edge inAngle], - [edge outAngle], - [edge bendMode], - [edge head].x, - [edge head].y, - [edge headTan].x, - [edge headTan].y, - [edge leftHeadNormal].x, - [edge leftHeadNormal].y, - [edge rightHeadNormal].x, - [edge rightHeadNormal].y, - [edge cp1].x, - [edge cp1].y, - [edge mid].x, - [edge mid].y, - [edge midTan].x, - [edge midTan].y, - [edge leftNormal].x, - [edge leftNormal].y, - [edge rightNormal].x, - [edge rightNormal].y, - [edge cp2].x, - [edge cp2].y, - [edge tail].x, - [edge tail].y, - [edge tailTan].x, - [edge tailTan].y, - [edge leftTailNormal].x, - [edge leftTailNormal].y, - [edge rightTailNormal].x, - [edge rightTailNormal].y, - [edge isSelfLoop] ? "yes" : "no", - [edge isStraight] ? "yes" : "no", - b.origin.x, b.origin.y, b.size.width, b.size.height); - } - } -} - -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface { - if (!NSIsEmptyRect (selectionBox)) { - [context saveState]; - - [context setAntialiasMode:AntialiasDisabled]; - [context setLineWidth:1.0]; - [context startPath]; - [context rect:selectionBox]; - RColor fColor = MakeRColor (0.8, 0.8, 0.8, 0.2); - RColor sColor = MakeSolidRColor (0.6, 0.6, 0.6); - [context strokePathWithColor:sColor andFillWithColor:fColor]; - - [context restoreState]; - } -} - -- (void) loadConfiguration:(Configuration*)config { - NSString *mode = [config stringEntry:@"Drag select mode" - inGroup:@"SelectTool"]; - if ([mode isEqualToString:@"nodes"]) { - [self setDragSelectMode:DragSelectsNodes]; - } else if ([mode isEqualToString:@"edges"]) { - [self setDragSelectMode:DragSelectsEdges]; - } else if ([mode isEqualToString:@"both"]) { - [self setDragSelectMode:DragSelectsBoth]; - } -} - -- (void) saveConfiguration:(Configuration*)config { - switch (dragSelectMode) { - case DragSelectsNodes: - [config setStringEntry:@"Drag select mode" - inGroup:@"SelectTool" - value:@"nodes"]; - break; - case DragSelectsEdges: - [config setStringEntry:@"Drag select mode" - inGroup:@"SelectTool" - value:@"edges"]; - break; - case DragSelectsBoth: - [config setStringEntry:@"Drag select mode" - inGroup:@"SelectTool" - value:@"both"]; - break; - } -} - -@end - -@implementation SelectTool (Private) -- (TikzDocument*) doc { - return [renderer document]; -} - -- (void) shiftNodesByMovingLeader:(Node*)leader to:(NSPoint)to { - Transformer *transformer = [renderer transformer]; - - NSPoint from = [transformer toScreen:[leader point]]; - to = [[renderer grid] snapScreenPoint:to]; - float dx = to.x - from.x; - float dy = to.y - from.y; - - for (Node *node in [[[self doc] pickSupport] selectedNodes]) { - NSPoint p = [transformer toScreen:[node point]]; - p.x += dx; - p.y += dy; - [node setPoint:[transformer fromScreen:p]]; - } -} - -- (void) deselectAllNodes { - [[[self doc] pickSupport] deselectAllNodes]; -} - -- (void) deselectAllEdges { - [[[self doc] pickSupport] deselectAllEdges]; -} - -- (void) deselectAll { - [[[self doc] pickSupport] deselectAllNodes]; - [[[self doc] pickSupport] deselectAllEdges]; -} - -- (BOOL) circleWithCenter:(NSPoint)c andRadius:(float)r containsPoint:(NSPoint)p { - return (NSDistanceBetweenPoints(c, p) <= r); -} - -- (void) lookForControlPointAt:(NSPoint)pos { - const float cpr = [Edge controlPointRadius]; - for (Edge *e in [[[self doc] pickSupport] selectedEdges]) { - NSPoint cp1 = [[renderer transformer] toScreen:[e cp1]]; - if ([self circleWithCenter:cp1 andRadius:cpr containsPoint:pos]) { - state = DragEdgeControlPoint1; - modifyEdge = e; - [[self doc] startModifyEdge:e]; - return; - } - NSPoint cp2 = [[renderer transformer] toScreen:[e cp2]]; - if ([self circleWithCenter:cp2 andRadius:cpr containsPoint:pos]) { - state = DragEdgeControlPoint2; - modifyEdge = e; - [[self doc] startModifyEdge:e]; - return; - } - } -} - -- (void) setSelectionBox:(NSRect)box { - NSRect invRect = NSUnionRect (selectionBox, box); - selectionBox = box; - [renderer invalidateRect:NSInsetRect (invRect, -2, -2)]; -} - -- (void) clearSelectionBox { - NSRect oldRect = selectionBox; - - selectionBox = NSZeroRect; - - [renderer invalidateRect:NSInsetRect (oldRect, -2, -2)]; - [renderer clearHighlightedNodes]; -} - -- (BOOL) selectionBoxContainsNode:(Node*)node { - if (!NSIsEmptyRect (selectionBox)) - return NO; - - Transformer *transf = [[renderer surface] transformer]; - NSPoint screenPt = [transf toScreen:[node point]]; - return NSPointInRect(screenPt, selectionBox); -} -@end - -static void drag_select_mode_cb (GtkToggleButton *button, SelectTool *tool) { - if (gtk_toggle_button_get_active (button)) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - DragSelectMode buttonMode = - (DragSelectMode) g_object_get_data ( - G_OBJECT (button), - DRAG_SELECT_MODE_KEY); - [tool setDragSelectMode:buttonMode]; - [pool drain]; - } -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/SelectionPane.h b/tikzit/src/gtk/SelectionPane.h deleted file mode 100644 index 57a766a..0000000 --- a/tikzit/src/gtk/SelectionPane.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class EdgeStylesModel; -@class NodeStylesModel; -@class StyleManager; -@class TikzDocument; - -@interface SelectionPane: NSObject { - TikzDocument *document; - - NodeStylesModel *nodeStylesModel; - EdgeStylesModel *edgeStylesModel; - - GtkWidget *layout; - - GtkWidget *nodeStyleCombo; - GtkWidget *applyNodeStyleButton; - GtkWidget *clearNodeStyleButton; - GtkWidget *edgeStyleCombo; - GtkWidget *applyEdgeStyleButton; - GtkWidget *clearEdgeStyleButton; -} - -@property (retain) TikzDocument *document; -@property (assign) BOOL visible; -@property (readonly) GtkWidget *gtkWidget; - -- (id) initWithStyleManager:(StyleManager*)mgr; -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm - andEdgeStylesModel:(EdgeStylesModel*)esm; - -- (void) loadConfiguration:(Configuration*)config; -- (void) saveConfiguration:(Configuration*)config; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/SelectionPane.m b/tikzit/src/gtk/SelectionPane.m deleted file mode 100644 index 2931258..0000000 --- a/tikzit/src/gtk/SelectionPane.m +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "SelectionPane.h" - -#import "Configuration.h" -#import "EdgeStylesModel.h" -#import "NodeStylesModel.h" -#import "TikzDocument.h" - -#import "gtkhelpers.h" - -// {{{ Internal interfaces - -static void node_style_changed_cb (GtkComboBox *widget, SelectionPane *pane); -static void apply_node_style_button_cb (GtkButton *widget, SelectionPane *pane); -static void clear_node_style_button_cb (GtkButton *widget, SelectionPane *pane); -static void edge_style_changed_cb (GtkComboBox *widget, SelectionPane *pane); -static void apply_edge_style_button_cb (GtkButton *widget, SelectionPane *pane); -static void clear_edge_style_button_cb (GtkButton *widget, SelectionPane *pane); - -static void setup_style_cell_layout (GtkCellLayout *cell_layout, gint pixbuf_col, gint name_col); - -@interface SelectionPane (Notifications) -- (void) nodeSelectionChanged:(NSNotification*)n; -- (void) edgeSelectionChanged:(NSNotification*)n; -@end - -@interface SelectionPane (Private) -- (void) _updateNodeStyleButtons; -- (void) _updateEdgeStyleButtons; -- (NodeStyle*) _selectedNodeStyle; -- (EdgeStyle*) _selectedEdgeStyle; -- (void) _applyNodeStyle; -- (void) _clearNodeStyle; -- (void) _applyEdgeStyle; -- (void) _clearEdgeStyle; -@end - -// }}} -// {{{ API - -@implementation SelectionPane - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithStyleManager:(StyleManager*)sm { - return [self initWithNodeStylesModel:[NodeStylesModel modelWithStyleManager:sm] - andEdgeStylesModel:[EdgeStylesModel modelWithStyleManager:sm]]; -} - -- (id) initWithNodeStylesModel:(NodeStylesModel*)nsm - andEdgeStylesModel:(EdgeStylesModel*)esm { - self = [super init]; - - if (self) { - nodeStylesModel = [nsm retain]; - edgeStylesModel = [esm retain]; - - layout = gtk_vbox_new (FALSE, 0); - g_object_ref_sink (layout); - gtk_widget_show (layout); - - GtkWidget *label = gtk_label_new ("Selection"); - label_set_bold (GTK_LABEL (label)); - gtk_widget_show (label); - gtk_box_pack_start (GTK_BOX (layout), label, - FALSE, FALSE, 0); - - GtkWidget *lvl1_box = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (layout), lvl1_box, - FALSE, FALSE, 3); - - nodeStyleCombo = gtk_combo_box_new_with_model ([nodeStylesModel model]); - g_object_ref_sink (nodeStyleCombo); - setup_style_cell_layout (GTK_CELL_LAYOUT (nodeStyleCombo), - NODE_STYLES_ICON_COL, - NODE_STYLES_NAME_COL); - g_signal_connect (G_OBJECT (nodeStyleCombo), - "changed", - G_CALLBACK (node_style_changed_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl1_box), nodeStyleCombo, - FALSE, FALSE, 0); - - GtkWidget *lvl2_box = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (lvl1_box), lvl2_box, - FALSE, FALSE, 0); - - applyNodeStyleButton = gtk_button_new_with_label ("Apply"); - g_object_ref_sink (applyNodeStyleButton); - gtk_widget_set_tooltip_text (applyNodeStyleButton, "Apply style to selected nodes"); - gtk_widget_set_sensitive (applyNodeStyleButton, FALSE); - g_signal_connect (G_OBJECT (applyNodeStyleButton), - "clicked", - G_CALLBACK (apply_node_style_button_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl2_box), applyNodeStyleButton, - FALSE, FALSE, 0); - - clearNodeStyleButton = gtk_button_new_with_label ("Clear"); - g_object_ref_sink (clearNodeStyleButton); - gtk_widget_set_tooltip_text (clearNodeStyleButton, "Clear style from selected nodes"); - gtk_widget_set_sensitive (clearNodeStyleButton, FALSE); - g_signal_connect (G_OBJECT (clearNodeStyleButton), - "clicked", - G_CALLBACK (clear_node_style_button_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl2_box), clearNodeStyleButton, - FALSE, FALSE, 0); - - lvl1_box = gtk_vbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (layout), lvl1_box, - FALSE, FALSE, 3); - - edgeStyleCombo = gtk_combo_box_new_with_model ([edgeStylesModel model]); - g_object_ref_sink (edgeStyleCombo); - setup_style_cell_layout (GTK_CELL_LAYOUT (edgeStyleCombo), - EDGE_STYLES_ICON_COL, - EDGE_STYLES_NAME_COL); - g_signal_connect (G_OBJECT (edgeStyleCombo), - "changed", - G_CALLBACK (edge_style_changed_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl1_box), edgeStyleCombo, - FALSE, FALSE, 0); - - lvl2_box = gtk_hbox_new (FALSE, 0); - gtk_box_pack_start (GTK_BOX (lvl1_box), lvl2_box, - FALSE, FALSE, 0); - - applyEdgeStyleButton = gtk_button_new_with_label ("Apply"); - g_object_ref_sink (applyEdgeStyleButton); - gtk_widget_set_tooltip_text (applyEdgeStyleButton, "Apply style to selected edges"); - gtk_widget_set_sensitive (applyEdgeStyleButton, FALSE); - g_signal_connect (G_OBJECT (applyEdgeStyleButton), - "clicked", - G_CALLBACK (apply_edge_style_button_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl2_box), applyEdgeStyleButton, - FALSE, FALSE, 0); - - clearEdgeStyleButton = gtk_button_new_with_label ("Clear"); - g_object_ref_sink (clearEdgeStyleButton); - gtk_widget_set_tooltip_text (clearEdgeStyleButton, "Clear style from selected edges"); - gtk_widget_set_sensitive (clearEdgeStyleButton, FALSE); - g_signal_connect (G_OBJECT (clearEdgeStyleButton), - "clicked", - G_CALLBACK (clear_edge_style_button_cb), - self); - gtk_box_pack_start (GTK_BOX (lvl2_box), clearEdgeStyleButton, - FALSE, FALSE, 0); - - gtk_widget_show_all (layout); - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - g_object_unref (nodeStyleCombo); - g_object_unref (applyNodeStyleButton); - g_object_unref (clearNodeStyleButton); - g_object_unref (edgeStyleCombo); - g_object_unref (applyEdgeStyleButton); - g_object_unref (clearEdgeStyleButton); - - g_object_unref (layout); - - [nodeStylesModel release]; - [edgeStylesModel release]; - - [document release]; - - [super dealloc]; -} - -- (TikzDocument*) document { - return document; -} - -- (void) setDocument:(TikzDocument*)doc { - if (document != nil) { - [[NSNotificationCenter defaultCenter] - removeObserver:self - name:nil - object:[document pickSupport]]; - } - - [doc retain]; - [document release]; - document = doc; - - if (doc != nil) { - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(nodeSelectionChanged:) - name:@"NodeSelectionChanged" object:[doc pickSupport]]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(edgeSelectionChanged:) - name:@"EdgeSelectionChanged" object:[doc pickSupport]]; - } - - [self _updateNodeStyleButtons]; - [self _updateEdgeStyleButtons]; -} - -- (BOOL) visible { - return gtk_widget_get_visible (layout); -} - -- (void) setVisible:(BOOL)visible { - gtk_widget_set_visible (layout, visible); -} - -- (GtkWidget*) gtkWidget { - return layout; -} - -- (void) loadConfiguration:(Configuration*)config { - NSString *nodeStyleName = [config stringEntry:@"SelectedNodeStyle" - inGroup:@"SelectionPane" - withDefault:nil]; - NodeStyle *nodeStyle = [[nodeStylesModel styleManager] nodeStyleForName:nodeStyleName]; - if (nodeStyle == nil) { - gtk_combo_box_set_active (GTK_COMBO_BOX (nodeStyleCombo), -1); - } else { - GtkTreeIter *iter = [nodeStylesModel iterFromStyle:nodeStyle]; - if (iter) { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (nodeStyleCombo), iter); - gtk_tree_iter_free (iter); - } - } - - NSString *edgeStyleName = [config stringEntry:@"SelectedEdgeStyle" - inGroup:@"SelectionPane" - withDefault:nil]; - EdgeStyle *edgeStyle = [[edgeStylesModel styleManager] edgeStyleForName:edgeStyleName]; - if (edgeStyle == nil) { - gtk_combo_box_set_active (GTK_COMBO_BOX (edgeStyleCombo), -1); - } else { - GtkTreeIter *iter = [edgeStylesModel iterFromStyle:edgeStyle]; - if (iter) { - gtk_combo_box_set_active_iter (GTK_COMBO_BOX (edgeStyleCombo), iter); - gtk_tree_iter_free (iter); - } - } -} - -- (void) saveConfiguration:(Configuration*)config { - [config setStringEntry:@"SelectedNodeStyle" - inGroup:@"SelectionPane" - value:[[self _selectedNodeStyle] name]]; - [config setStringEntry:@"SelectedEdgeStyle" - inGroup:@"SelectionPane" - value:[[self _selectedEdgeStyle] name]]; -} - -@end - -// }}} -// {{{ Notifications - -@implementation SelectionPane (Notifications) -- (void) nodeSelectionChanged:(NSNotification*)n { - [self _updateNodeStyleButtons]; -} - -- (void) edgeSelectionChanged:(NSNotification*)n { - [self _updateEdgeStyleButtons]; -} -@end - -// }}} -// {{{ Private - -@implementation SelectionPane (Private) -- (void) _updateNodeStyleButtons { - gboolean hasNodeSelection = [[[document pickSupport] selectedNodes] count] > 0; - - gtk_widget_set_sensitive (applyNodeStyleButton, - hasNodeSelection && [self _selectedNodeStyle] != nil); - gtk_widget_set_sensitive (clearNodeStyleButton, hasNodeSelection); -} - -- (void) _updateEdgeStyleButtons { - gboolean hasEdgeSelection = [[[document pickSupport] selectedEdges] count] > 0; - - gtk_widget_set_sensitive (applyEdgeStyleButton, - hasEdgeSelection && [self _selectedEdgeStyle] != nil); - gtk_widget_set_sensitive (clearEdgeStyleButton, hasEdgeSelection); -} - -- (NodeStyle*) _selectedNodeStyle { - GtkTreeIter iter; - if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (nodeStyleCombo), &iter)) { - return [nodeStylesModel styleFromIter:&iter]; - } else { - return nil; - } -} - -- (EdgeStyle*) _selectedEdgeStyle { - GtkTreeIter iter; - if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (edgeStyleCombo), &iter)) { - return [edgeStylesModel styleFromIter:&iter]; - } else { - return nil; - } -} - -- (void) _applyNodeStyle { - [document startModifyNodes:[[document pickSupport] selectedNodes]]; - - NodeStyle *style = [self _selectedNodeStyle]; - for (Node *node in [[document pickSupport] selectedNodes]) { - [node setStyle:style]; - } - - [document endModifyNodes]; -} - -- (void) _clearNodeStyle { - [document startModifyNodes:[[document pickSupport] selectedNodes]]; - - for (Node *node in [[document pickSupport] selectedNodes]) { - [node setStyle:nil]; - } - - [document endModifyNodes]; -} - -- (void) _applyEdgeStyle { - [document startModifyEdges:[[document pickSupport] selectedEdges]]; - - EdgeStyle *style = [self _selectedEdgeStyle]; - for (Edge *edge in [[document pickSupport] selectedEdges]) { - [edge setStyle:style]; - } - - [document endModifyEdges]; -} - -- (void) _clearEdgeStyle { - [document startModifyEdges:[[document pickSupport] selectedEdges]]; - - for (Edge *edge in [[document pickSupport] selectedEdges]) { - [edge setStyle:nil]; - } - - [document endModifyEdges]; -} -@end - -// }}} -// {{{ GTK+ callbacks - -static void node_style_changed_cb (GtkComboBox *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _updateNodeStyleButtons]; - [pool drain]; -} - -static void apply_node_style_button_cb (GtkButton *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _applyNodeStyle]; - [pool drain]; -} - -static void clear_node_style_button_cb (GtkButton *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _clearNodeStyle]; - [pool drain]; -} - -static void edge_style_changed_cb (GtkComboBox *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _updateEdgeStyleButtons]; - [pool drain]; -} - -static void apply_edge_style_button_cb (GtkButton *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _applyEdgeStyle]; - [pool drain]; -} - -static void clear_edge_style_button_cb (GtkButton *widget, SelectionPane *pane) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [pane _clearEdgeStyle]; - [pool drain]; -} - -// }}} -// -static void setup_style_cell_layout (GtkCellLayout *cell_layout, gint pixbuf_col, gint name_col) { - gtk_cell_layout_clear (cell_layout); - GtkCellRenderer *pixbuf_renderer = gtk_cell_renderer_pixbuf_new (); - gtk_cell_layout_pack_start (cell_layout, pixbuf_renderer, FALSE); - gtk_cell_layout_set_attributes ( - cell_layout, - pixbuf_renderer, - "pixbuf", pixbuf_col, - NULL); - GtkCellRenderer *text_renderer = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (cell_layout, text_renderer, FALSE); - gtk_cell_layout_set_attributes ( - cell_layout, - text_renderer, - "text", name_col, - NULL); -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/SettingsDialog.h b/tikzit/src/gtk/SettingsDialog.h deleted file mode 100644 index 0f687b3..0000000 --- a/tikzit/src/gtk/SettingsDialog.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class EdgeStylesPalette; -@class NodeStylesPalette; -@class StyleManager; - -@interface SettingsDialog: NSObject { - Configuration *configuration; - StyleManager *styleManager; - StyleManager *tempStyleManager; - NodeStylesPalette *nodePalette; - EdgeStylesPalette *edgePalette; - - GtkWindow *parentWindow; - GtkWindow *window; - - // we don't keep any refs, as we control - // the top window - GtkEntry *pdflatexPathEntry; -} - -@property (retain) Configuration *configuration; -@property (retain) StyleManager *styleManager; -@property (assign) GtkWindow *parentWindow; -@property (assign,getter=isVisible) BOOL visible; - -- (id) initWithConfiguration:(Configuration*)c andStyleManager:(StyleManager*)m; - -- (void) present; -- (void) show; -- (void) hide; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/SettingsDialog.m b/tikzit/src/gtk/SettingsDialog.m deleted file mode 100644 index bdb5db6..0000000 --- a/tikzit/src/gtk/SettingsDialog.m +++ /dev/null @@ -1,328 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "SettingsDialog.h" - -#import "Application.h" -#import "Configuration.h" -#import "EdgeStylesPalette.h" -#import "NodeStylesPalette.h" -#import "StyleManager.h" - -// {{{ Internal interfaces -// {{{ Signals -static gboolean window_delete_event_cb (GtkWidget *widget, - GdkEvent *event, - SettingsDialog *dialog); -static void ok_button_clicked_cb (GtkButton *widget, SettingsDialog *dialog); -static void cancel_button_clicked_cb (GtkButton *widget, SettingsDialog *dialog); -// }}} - -@interface SettingsDialog (Private) -- (void) loadUi; -- (void) save; -- (void) revert; -@end - -// }}} -// {{{ API - -@implementation SettingsDialog - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithConfiguration:(Configuration*)c andStyleManager:(StyleManager*)m { - self = [super init]; - - if (self) { - configuration = [c retain]; - styleManager = [m retain]; - tempStyleManager = [m copy]; - } - - return self; -} - -- (void) dealloc { - if (window) { - gtk_widget_destroy (GTK_WIDGET (window)); - } - if (parentWindow) { - g_object_unref (parentWindow); - } - - [configuration release]; - [tempStyleManager release]; - [styleManager release]; - [nodePalette release]; - [edgePalette release]; - - [super dealloc]; -} - -- (Configuration*) configuration { - return configuration; -} - -- (void) setConfiguration:(Configuration*)c { - [c retain]; - [configuration release]; - configuration = c; - [self revert]; -} - -- (StyleManager*) styleManager { - return styleManager; -} - -- (void) setStyleManager:(StyleManager*)m { - [m retain]; - [styleManager release]; - styleManager = m; -} - -- (GtkWindow*) parentWindow { - return parentWindow; -} - -- (void) setParentWindow:(GtkWindow*)parent { - GtkWindow *oldParent = parentWindow; - - if (parent) - g_object_ref (parent); - parentWindow = parent; - if (oldParent) - g_object_unref (oldParent); - - if (window) { - gtk_window_set_transient_for (window, parentWindow); - } -} - -- (void) present { - [self loadUi]; - [self revert]; - gtk_window_present (GTK_WINDOW (window)); -} - -- (void) show { - [self loadUi]; - [self revert]; - gtk_widget_show (GTK_WIDGET (window)); -} - -- (void) hide { - if (!window) { - return; - } - gtk_widget_hide (GTK_WIDGET (window)); -} - -- (BOOL) isVisible { - if (!window) { - return NO; - } - gboolean visible; - g_object_get (G_OBJECT (window), "visible", &visible, NULL); - return visible ? YES : NO; -} - -- (void) setVisible:(BOOL)visible { - if (visible) { - [self show]; - } else { - [self hide]; - } -} - -@end - -// }}} -// {{{ Private - -@implementation SettingsDialog (Private) -- (void) loadUi { - if (window) { - return; - } - - nodePalette = [[NodeStylesPalette alloc] initWithManager:tempStyleManager]; - edgePalette = [[EdgeStylesPalette alloc] initWithManager:tempStyleManager]; - - window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - gtk_window_set_default_size (window, 570, -1); - gtk_window_set_title (window, "TikZiT Configuration"); - gtk_window_set_modal (window, TRUE); - gtk_window_set_position (window, GTK_WIN_POS_CENTER_ON_PARENT); - gtk_window_set_type_hint (window, GDK_WINDOW_TYPE_HINT_DIALOG); - if (parentWindow) { - gtk_window_set_transient_for (window, parentWindow); - } - g_signal_connect (window, - "delete-event", - G_CALLBACK (window_delete_event_cb), - self); - - GtkWidget *mainBox = gtk_vbox_new (FALSE, 18); - gtk_container_set_border_width (GTK_CONTAINER (mainBox), 12); - gtk_container_add (GTK_CONTAINER (window), mainBox); - gtk_widget_show (mainBox); - -#ifdef HAVE_POPPLER - /* - * Path for pdflatex - */ - - GtkWidget *pdflatexFrame = gtk_frame_new ("Previews"); - gtk_box_pack_start (GTK_BOX (mainBox), pdflatexFrame, TRUE, TRUE, 0); - - GtkBox *pdflatexBox = GTK_BOX (gtk_hbox_new (FALSE, 6)); - gtk_container_add (GTK_CONTAINER (pdflatexFrame), GTK_WIDGET (pdflatexBox)); - gtk_container_set_border_width (GTK_CONTAINER (pdflatexBox), 6); - - GtkWidget *pdflatexLabel = gtk_label_new ("Path to pdflatex:"); - gtk_misc_set_alignment (GTK_MISC (pdflatexLabel), 0, 0.5); - gtk_box_pack_start (pdflatexBox, - pdflatexLabel, - FALSE, TRUE, 0); - - pdflatexPathEntry = GTK_ENTRY (gtk_entry_new ()); - gtk_box_pack_start (pdflatexBox, - GTK_WIDGET (pdflatexPathEntry), - TRUE, TRUE, 0); - - gtk_widget_show_all (pdflatexFrame); -#else - pdflatexPathEntry = NULL; -#endif - - /* - * Node styles - */ - GtkWidget *nodeStylesFrame = gtk_frame_new ("Node Styles"); - gtk_widget_show (nodeStylesFrame); - gtk_box_pack_start (GTK_BOX (mainBox), nodeStylesFrame, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER (nodeStylesFrame), - GTK_WIDGET ([nodePalette widget])); - gtk_widget_show ([nodePalette widget]); - - - /* - * Edge styles - */ - GtkWidget *edgeStylesFrame = gtk_frame_new ("Edge Styles"); - gtk_widget_show (edgeStylesFrame); - gtk_box_pack_start (GTK_BOX (mainBox), edgeStylesFrame, TRUE, TRUE, 0); - gtk_container_add (GTK_CONTAINER (edgeStylesFrame), - GTK_WIDGET ([edgePalette widget])); - gtk_widget_show ([edgePalette widget]); - - - /* - * Bottom buttons - */ - - GtkContainer *buttonBox = GTK_CONTAINER (gtk_hbutton_box_new ()); - gtk_box_set_spacing (GTK_BOX (buttonBox), 6); - gtk_button_box_set_layout (GTK_BUTTON_BOX (buttonBox), GTK_BUTTONBOX_END); - gtk_box_pack_start (GTK_BOX (mainBox), - GTK_WIDGET (buttonBox), - FALSE, TRUE, 0); - - GtkWidget *okButton = gtk_button_new_from_stock (GTK_STOCK_OK); - gtk_container_add (buttonBox, okButton); - g_signal_connect (okButton, - "clicked", - G_CALLBACK (ok_button_clicked_cb), - self); - - GtkWidget *cancelButton = gtk_button_new_from_stock (GTK_STOCK_CANCEL); - gtk_container_add (buttonBox, cancelButton); - g_signal_connect (cancelButton, - "clicked", - G_CALLBACK (cancel_button_clicked_cb), - self); - - gtk_widget_show_all (GTK_WIDGET (buttonBox)); - - [self revert]; -} - -- (void) save { - if (!window) - return; - -#ifdef HAVE_POPPLER - const gchar *path = gtk_entry_get_text (pdflatexPathEntry); - if (path && *path) { - [configuration setStringEntry:@"pdflatex" - inGroup:@"Previews" - value:[NSString stringWithUTF8String:path]]; - } -#endif - - [styleManager updateFromManager:tempStyleManager]; - - [app saveConfiguration]; -} - -- (void) revert { - if (!window) - return; - -#ifdef HAVE_POPPLER - NSString *path = [configuration stringEntry:@"pdflatex" - inGroup:@"Previews" - withDefault:@"pdflatex"]; - gtk_entry_set_text (pdflatexPathEntry, [path UTF8String]); -#endif - - [tempStyleManager updateFromManager:styleManager]; -} -@end - -// }}} -// {{{ GTK+ callbacks - -static gboolean window_delete_event_cb (GtkWidget *widget, - GdkEvent *event, - SettingsDialog *dialog) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [dialog hide]; - [pool drain]; - return TRUE; // we dealt with this event -} - -static void ok_button_clicked_cb (GtkButton *widget, SettingsDialog *dialog) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [dialog save]; - [dialog hide]; - [pool drain]; -} - -static void cancel_button_clicked_cb (GtkButton *widget, SettingsDialog *dialog) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [dialog hide]; - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=4:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/Shape+Render.h b/tikzit/src/gtk/Shape+Render.h deleted file mode 100644 index a744c77..0000000 --- a/tikzit/src/gtk/Shape+Render.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "Shape.h" -#import "RenderContext.h" -#import "Surface.h" - -@interface Shape (Render) - -- (void) drawPathWithTransform:(Transformer*)transform andContext:(id<RenderContext>)context; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Shape+Render.m b/tikzit/src/gtk/Shape+Render.m deleted file mode 100644 index 924bb24..0000000 --- a/tikzit/src/gtk/Shape+Render.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Shape+Render.h" - -#import "Edge.h" - -// we use cairo for finding the bounding box etc. -#import <cairo/cairo.h> - -@implementation Shape (Render) - -- (void) drawPathWithTransform:(Transformer*)transform andContext:(id<RenderContext>)context { - [context startPath]; - - for (NSArray *arr in [self paths]) { - BOOL fst = YES; - NSPoint p, cp1, cp2; - - for (Edge *e in arr) { - if (fst) { - fst = NO; - p = [transform toScreen:[[e source] point]]; - [context moveTo:p]; - } - - p = [transform toScreen:[[e target] point]]; - if ([e isStraight]) { - [context lineTo:p]; - } else { - cp1 = [transform toScreen:[e cp1]]; - cp2 = [transform toScreen:[e cp2]]; - [context curveTo:p withCp1:cp1 andCp2:cp2]; - } - } - - [context closeSubPath]; - } -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/StyleManager+Storage.h b/tikzit/src/gtk/StyleManager+Storage.h deleted file mode 100644 index 1727786..0000000 --- a/tikzit/src/gtk/StyleManager+Storage.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "StyleManager.h" - -@interface StyleManager (Storage) -- (void) loadStylesUsingConfigurationName:(NSString*)name; -- (void) saveStylesUsingConfigurationName:(NSString*)name; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/StyleManager+Storage.m b/tikzit/src/gtk/StyleManager+Storage.m deleted file mode 100644 index f4c8232..0000000 --- a/tikzit/src/gtk/StyleManager+Storage.m +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "StyleManager+Storage.h" -#import "Configuration.h" -#import "NodeStyle+Storage.h" -#import "EdgeStyle+Storage.h" - -static NSString *nodeStyleGroupPrefix = @"Style "; -static NSString *edgeStyleGroupPrefix = @"EdgeStyle "; - -@implementation StyleManager (Storage) - -- (void) loadStylesUsingConfigurationName:(NSString*)name { - if (![Configuration configurationExistsWithName:name]) { - NSLog(@"No styles config found"); - return; - } - NSError *error = nil; - Configuration *stylesConfig = [Configuration configurationWithName:name loadError:&error]; - if (error != nil) { - logError (error, @"Could not load styles configuration"); - // stick with the default config - return; - } - NSArray *groups = [stylesConfig groups]; - NSMutableArray *ns = [NSMutableArray arrayWithCapacity:[groups count]]; - NSMutableArray *es = [NSMutableArray arrayWithCapacity:[groups count]]; - - for (NSString *groupName in groups) { - if ([groupName hasPrefix:nodeStyleGroupPrefix]) { - NodeStyle *style = [[NodeStyle alloc] initFromConfigurationGroup:groupName config:stylesConfig]; - [ns addObject:style]; - } else if ([groupName hasPrefix:edgeStyleGroupPrefix]) { - EdgeStyle *style = [[EdgeStyle alloc] initFromConfigurationGroup:groupName config:stylesConfig]; - [es addObject:style]; - } - } - - [self _setNodeStyles:ns]; - [self _setEdgeStyles:es]; -} - -- (void) saveStylesUsingConfigurationName:(NSString*)name { - NSError *error = nil; - Configuration *stylesConfig = [Configuration emptyConfigurationWithName:name]; - NSArray *ns = [self nodeStyles]; - NSArray *es = [self edgeStyles]; - NSUInteger length = [ns count]; - for (int i = 0; i < length; ++i) { - NodeStyle *style = [ns objectAtIndex:i]; - NSString *groupName = [NSString stringWithFormat:@"%@%d", nodeStyleGroupPrefix, i]; - [style storeToConfigurationGroup:groupName config:stylesConfig]; - } - length = [es count]; - for (int i = 0; i < length; ++i) { - EdgeStyle *style = [es objectAtIndex:i]; - NSString *groupName = [NSString stringWithFormat:@"%@%d", edgeStyleGroupPrefix, i]; - [style storeToConfigurationGroup:groupName config:stylesConfig]; - } - if (![stylesConfig writeToStoreWithError:&error]) { - logError (error, @"Could not write styles configuration"); - } -} - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Surface.h b/tikzit/src/gtk/Surface.h deleted file mode 100644 index db4288e..0000000 --- a/tikzit/src/gtk/Surface.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "RenderContext.h" -#import "Transformer.h" - -typedef enum { - NormalCursor, - ResizeRightCursor, - ResizeBottomRightCursor, - ResizeBottomCursor, - ResizeBottomLeftCursor, - ResizeLeftCursor, - ResizeTopLeftCursor, - ResizeTopCursor, - ResizeTopRightCursor -} Cursor; - -@protocol Surface; - -@protocol RenderDelegate <NSObject> -- (void) renderWithContext:(id<RenderContext>)context onSurface:(id<Surface>)surface; -@end - -/** - * Represents a surface that can be rendered to - * - * This protocol should be implemented by drawing surfaces. It - * provides geometry information and methods to invalidate - * regions of the surface, triggering a redraw. - * - * The surface should send a "SurfaceSizeChanged" notification - * when the width or height changes. - */ -@protocol Surface <NSObject> - -/** - * The width of the surface, in surface units - * - * The surface should send a "SurfaceSizeChanged" notification - * when this property changes. - */ -@property (readonly) int width; -/** - * The height of the surface, in surface units - * - * The surface should send a "SurfaceSizeChanged" notification - * when this property changes. - */ -@property (readonly) int height; -/** - * The transformer that converts between graph units and surface units - */ -@property (readonly) Transformer *transformer; -/** - * The render delegate. - * - * This will be used to redraw (parts of) the surface when necessary. - */ -@property (assign) id<RenderDelegate> renderDelegate; - -/** - * Create a render context for the surface. - */ -- (id<RenderContext>) createRenderContext; -/** - * Invalidate a portion of the surface. - * - * This will request that part of the surface be redrawn. - */ -- (void) invalidateRect:(NSRect)rect; -/** - * Invalidate the whole surface. - * - * This will request that the whole surface be redrawn. - */ -- (void) invalidate; - -- (void) zoomIn; -- (void) zoomOut; -- (void) zoomReset; -- (void) zoomInAboutPoint:(NSPoint)p; -- (void) zoomOutAboutPoint:(NSPoint)p; -- (void) zoomResetAboutPoint:(NSPoint)p; - -- (void) setCursor:(Cursor)c; - -- (BOOL) hasFocus; -- (void) renderFocus; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/TZFoundation.h b/tikzit/src/gtk/TZFoundation.h deleted file mode 100644 index 2ff20ca..0000000 --- a/tikzit/src/gtk/TZFoundation.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import <Foundation/Foundation.h> -#import <glib.h> - -#import "NSError+Glib.h" -#import "NSError+Tikzit.h" -#import "NSFileManager+Glib.h" -#import "NSFileManager+Utils.h" -#import "NSString+Glib.h" -#import "NSString+LatexConstants.h" -#import "NSString+Tikz.h" -#import "NSString+Util.h" - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/TikzDocument.h b/tikzit/src/gtk/TikzDocument.h deleted file mode 100644 index 5d15d13..0000000 --- a/tikzit/src/gtk/TikzDocument.h +++ /dev/null @@ -1,149 +0,0 @@ -// -// TikzDocument.h -// TikZiT -// -// Copyright 2010 Chris Heunen -// Copyright 2010 Alex Merry -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// - -#import "TZFoundation.h" -#import <Graph.h> -#import "PickSupport.h" -#import "StyleManager.h" - -@interface TikzDocument : NSObject { - StyleManager *styleManager; - Graph *graph; - PickSupport *pickSupport; - NSUndoManager *undoManager; - NSString *tikz; - NSString *path; - NSSet *nodesetBeingModified; - NSMapTable *nodesetBeingModifiedOldCopy; - NSSet *edgesetBeingModified; - NSMapTable *edgesetBeingModifiedOldCopy; - NSPoint currentNodeShift; - Node *nodeBeingModified; - Node *nodeBeingModifiedOldCopy; - Edge *edgeBeingModified; - Edge *edgeBeingModifiedOldCopy; - NSRect oldGraphBounds; - GraphElementData *oldGraphData; - BOOL hasChanges; -} - -+ (TikzDocument*) documentWithStyleManager:(StyleManager*)manager; -+ (TikzDocument*) documentWithGraph:(Graph*)g styleManager:(StyleManager*)manager; -+ (TikzDocument*) documentWithTikz:(NSString*)t styleManager:(StyleManager*)manager error:(NSError**)error; -+ (TikzDocument*) documentFromFile:(NSString*)path styleManager:(StyleManager*)manager error:(NSError**)error; - -- (id) initWithStyleManager:(StyleManager*)manager; -- (id) initWithGraph:(Graph*)g styleManager:(StyleManager*)manager; -- (id) initWithTikz:(NSString*)t styleManager:(StyleManager*)manager error:(NSError**)error; -- (id) initFromFile:(NSString*)path styleManager:(StyleManager*)manager error:(NSError**)error; - -@property (readonly) Graph *graph; -@property (readonly) PickSupport *pickSupport; -@property (readonly) NSString *path; -@property (readonly) NSString *name; -@property (readonly) NSString *suggestedFileName; -@property (readonly) BOOL hasUnsavedChanges; -@property (retain) StyleManager *styleManager; -@property (readonly) NSString *tikz; -@property (readonly) BOOL canUndo; -@property (readonly) BOOL canRedo; -@property (readonly) NSString *undoName; -@property (readonly) NSString *redoName; - -- (BOOL) updateTikz:(NSString*)t error:(NSError**)error; - -- (Graph*) selectionCut; -- (Graph*) selectionCopy; -- (void) paste:(Graph*)graph; -- (void) pasteFromTikz:(NSString*)tikz; - -// some convenience methods: -- (BOOL) isNodeSelected:(Node*)node; -- (BOOL) isEdgeSelected:(Edge*)edge; -- (NSEnumerator*) nodeEnumerator; -- (NSEnumerator*) edgeEnumerator; - -- (void) undo; -- (void) redo; - -- (void) startUndoGroup; -- (void) nameAndEndUndoGroup:(NSString*)nm; -- (void) endUndoGroup; - -- (void) startModifyNode:(Node*)node; -- (void) modifyNodeCheckPoint; -- (void) endModifyNode; -- (void) cancelModifyNode; - -- (void) startModifyNodes:(NSSet*)nodes; -- (void) modifyNodesCheckPoint; -- (void) endModifyNodes; -- (void) cancelModifyNodes; - -- (void) startShiftNodes:(NSSet*)nodes; -- (void) shiftNodesUpdate:(NSPoint)shiftChange; -- (void) endShiftNodes; -- (void) cancelShiftNodes; - -- (void) startModifyEdge:(Edge*)edge; -- (void) modifyEdgeCheckPoint; -- (void) endModifyEdge; -- (void) cancelModifyEdge; - -- (void) startModifyEdges:(NSSet*)edges; -- (void) modifyEdgesCheckPoint; -- (void) endModifyEdges; -- (void) cancelModifyEdges; - -- (void) startChangeBoundingBox; -- (void) changeBoundingBoxCheckPoint; -- (void) endChangeBoundingBox; -- (void) cancelChangeBoundingBox; - -- (void) startChangeGraphProperties; -- (void) changeGraphPropertiesCheckPoint; -- (void) endChangeGraphProperties; -- (void) cancelChangeGraphProperties; - -- (void) removeSelected; -- (void) addNode:(Node*)node; -- (void) removeNode:(Node*)node; -- (void) addEdge:(Edge*)edge; -- (void) removeEdge:(Edge*)edge; -- (void) shiftSelectedNodesByPoint:(NSPoint)offset; -- (void) insertGraph:(Graph*)g; -- (void) flipSelectedNodesHorizontally; -- (void) flipSelectedNodesVertically; -- (void) reverseSelectedEdges; -- (void) bringSelectionForward; -- (void) bringSelectionToFront; -- (void) sendSelectionBackward; -- (void) sendSelectionToBack; - -- (BOOL) saveCopyToPath: (NSString*)path error: (NSError**)error; -- (BOOL) saveToPath: (NSString*)path error: (NSError**)error; -- (BOOL) save: (NSError**)error; - -@end - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/TikzDocument.m b/tikzit/src/gtk/TikzDocument.m deleted file mode 100644 index bff5a2e..0000000 --- a/tikzit/src/gtk/TikzDocument.m +++ /dev/null @@ -1,911 +0,0 @@ -// -// TikzDocument.h -// TikZiT -// -// Copyright 2010 Chris Heunen -// Copyright 2010 Alex Merry -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// - -#import "TikzDocument.h" - -@interface TikzDocument (Private) -- (void) styleRenamed:(NSNotification*)n; - -- (void) setPath:(NSString*)path; -- (void) setGraph:(Graph*)g; - -- (void) registerUndoForChange:(GraphChange*)change; -- (void) registerUndoGroupForChange:(GraphChange*)change withName:(NSString*)name; -- (void) undoGraphChange:(GraphChange*)change; -- (void) completedGraphChange:(GraphChange*)change withName:(NSString*)name; -- (void) attachStylesToGraph:(Graph*)g; - -- (void) regenerateTikz; -@end - -@implementation TikzDocument - -+ (TikzDocument*) documentWithStyleManager:(StyleManager*)manager -{ - return [[[TikzDocument alloc] initWithStyleManager:manager] autorelease]; -} - -+ (TikzDocument*) documentWithGraph:(Graph*)g - styleManager:(StyleManager*)manager -{ - return [[[TikzDocument alloc] initWithGraph:g - styleManager:manager] autorelease]; -} - -+ (TikzDocument*) documentWithTikz:(NSString*)t - styleManager:(StyleManager*)manager - error:(NSError**)error -{ - return [[[TikzDocument alloc] initWithTikz:t - styleManager:manager - error:error] autorelease]; -} - -+ (TikzDocument*) documentFromFile:(NSString*)pth - styleManager:(StyleManager*)manager - error:(NSError**)error -{ - return [[[TikzDocument alloc] initFromFile:pth - styleManager:manager - error:error] autorelease]; -} - - -- (id) initWithStyleManager:(StyleManager*)manager { - self = [self initWithGraph:[Graph graph] styleManager:manager]; - return self; -} - -- (id) initWithGraph:(Graph*)g styleManager:(StyleManager*)manager { - self = [super init]; - - if (self) { - graph = nil; - styleManager = [manager retain]; - pickSupport = [[PickSupport alloc] init]; - undoManager = [[NSUndoManager alloc] init]; - [undoManager setGroupsByEvent:NO]; - tikz = nil; - path = nil; - nodesetBeingModified = nil; - nodesetBeingModifiedOldCopy = nil; - nodeBeingModified = nil; - nodeBeingModifiedOldCopy = nil; - edgeBeingModified = nil; - edgeBeingModifiedOldCopy = nil; - - [undoManager disableUndoRegistration]; - [self setGraph:g]; - [undoManager enableUndoRegistration]; - - hasChanges = NO; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(styleRenamed:) - name:@"NodeStyleRenamed" - object:styleManager]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(styleRenamed:) - name:@"EdgeStyleRenamed" - object:styleManager]; - } - - return self; -} - -- (id) initWithTikz:(NSString*)t - styleManager:(StyleManager*)manager - error:(NSError**)error -{ - self = [self initWithStyleManager:manager]; - - if (self) { - [undoManager disableUndoRegistration]; - BOOL success = [self updateTikz:t error:error]; - if (!success) { - [self release]; - return nil; - } - [undoManager enableUndoRegistration]; - hasChanges = NO; - } - - return self; -} - -- (id) initFromFile:(NSString*)pth - styleManager:(StyleManager*)manager - error:(NSError**)error -{ - NSString *t = [NSString stringWithContentsOfFile:pth error:error]; - if (t == nil) { - [self release]; - return nil; - } - - self = [self initWithTikz:t styleManager:manager error:error]; - - if (self) { - [self setPath:pth]; - } - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [styleManager release]; - [graph release]; - [pickSupport release]; - [undoManager release]; - [tikz release]; - [path release]; - [nodesetBeingModified release]; - [nodesetBeingModifiedOldCopy release]; - [nodeBeingModified release]; - [nodeBeingModifiedOldCopy release]; - [edgeBeingModified release]; - [edgeBeingModifiedOldCopy release]; - [oldGraphData release]; - [super dealloc]; -} - -@synthesize graph, pickSupport, path; - -- (NSString*) name { - if (path) { - return [[NSFileManager defaultManager] displayNameAtPath: path]; - } else { - return @"Untitled"; - } -} - -- (NSString*) suggestedFileName { - if (path) { - return [path lastPathComponent]; - } else { - return @"untitled.tikz"; - } -} - -- (BOOL) hasUnsavedChanges { - return hasChanges; -} - -- (StyleManager*) styleManager { - return styleManager; -} - -- (void) setStyleManager:(StyleManager*)manager { - StyleManager *oldManager = styleManager; - [[NSNotificationCenter defaultCenter] - removeObserver:self - name:nil - object:oldManager]; - - styleManager = [manager retain]; - - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(styleRenamed:) - name:@"NodeStyleRenamed" - object:styleManager]; - [[NSNotificationCenter defaultCenter] - addObserver:self - selector:@selector(styleRenamed:) - name:@"EdgeStyleRenamed" - object:styleManager]; - - [self attachStylesToGraph:graph]; - [oldManager release]; -} - -- (void) postGraphReplaced { - [[NSNotificationCenter defaultCenter] postNotificationName:@"GraphReplaced" object:self]; -} - -- (void) postGraphChange:(GraphChange*)change { - NSDictionary *info = [NSDictionary dictionaryWithObject:change forKey:@"change"]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"GraphChanged" object:self userInfo:info]; -} - -- (void) postIncompleteGraphChange:(GraphChange*)change { - NSDictionary *info = [NSDictionary dictionaryWithObject:change forKey:@"change"]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"GraphBeingChanged" object:self userInfo:info]; -} - -- (void) postCancelledGraphChange:(GraphChange*)change { - NSDictionary *info = [NSDictionary dictionaryWithObject:change forKey:@"change"]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"GraphChangeCancelled" object:self userInfo:info]; -} - -- (void) postTikzChanged { - [[NSNotificationCenter defaultCenter] postNotificationName:@"TikzChanged" object:self]; -} - -- (void) postUndoStackChanged { - [[NSNotificationCenter defaultCenter] postNotificationName:@"UndoStackChanged" object:self]; -} - -- (NSString*) tikz { - return tikz; -} - -- (BOOL) updateTikz:(NSString*)t error:(NSError**)error { - if (t == nil) { - t = [NSString string]; - } - if (t == tikz || [t isEqual:tikz]) { - return YES; - } - - Graph *g = [Graph graphFromTikz:t error:error]; - if (g) { - // updateTikz actually generates a graph from the tikz, - // and generates the final tikz from that - [self startUndoGroup]; - [self setGraph:g]; - [self nameAndEndUndoGroup:@"Update tikz"]; - return YES; - } - - return NO; -} - -- (Graph*) selectionCut { - Graph *selection = [self selectionCopy]; - [self startUndoGroup]; - [self removeSelected]; - [self nameAndEndUndoGroup:@"Cut"]; - return selection; -} - -- (Graph*) selectionCopy { - return [[graph copyOfSubgraphWithNodes:[pickSupport selectedNodes]] autorelease]; -} - -- (void) paste:(Graph*)g { - if (g == nil || [[g nodes] count] == 0) { - // nothing to paste - return; - } - - // place to the right of the existing graph - NSRect bounds = [graph bounds]; - NSRect gBounds = [g bounds]; - float dx = NSMaxX (bounds) - gBounds.origin.x + 0.5f; - [g shiftNodes:[g nodes] byPoint:NSMakePoint (dx, 0)]; - - GraphChange *change = [graph insertGraph:g]; - [self completedGraphChange:change withName:@"Paste"]; - - // select everything from the clipboard - [pickSupport deselectAllEdges]; - [pickSupport selectAllNodes:[NSSet setWithArray:[g nodes]] replacingSelection:YES]; -} - -- (void) pasteFromTikz:(NSString*)t { - Graph *clipboard = [Graph graphFromTikz:t]; - if (clipboard) { - [self attachStylesToGraph:clipboard]; - [self paste:clipboard]; - } -} - -- (BOOL) isNodeSelected:(Node*)node { - return [pickSupport isNodeSelected:node]; -} - -- (BOOL) isEdgeSelected:(Edge*)edge { - return [pickSupport isEdgeSelected:edge]; -} - -- (NSEnumerator*) nodeEnumerator { - return [[graph nodes] objectEnumerator]; -} - -- (NSEnumerator*) edgeEnumerator { - return [[graph edges] objectEnumerator]; -} - -- (BOOL) canUndo { - return [undoManager canUndo]; -} - -- (void) undo { - [undoManager undo]; - [self postUndoStackChanged]; -} - -- (BOOL) canRedo { - return [undoManager canRedo]; -} - -- (void) redo { - [undoManager redo]; - [self postUndoStackChanged]; -} - -- (NSString*) undoName { - return [undoManager undoActionName]; -} - -- (NSString*) redoName { - return [undoManager redoActionName]; -} - -- (void) startUndoGroup { - [undoManager beginUndoGrouping]; -} - -- (void) nameAndEndUndoGroup:(NSString*)nm { - [undoManager setActionName:nm]; - [undoManager endUndoGrouping]; - [self postUndoStackChanged]; -} - -- (void) endUndoGroup { - [undoManager endUndoGrouping]; - [self postUndoStackChanged]; -} - -- (void) startModifyNode:(Node*)node { - if (nodeBeingModified != nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Already modifying a node"]; - } - nodeBeingModified = [node retain]; - nodeBeingModifiedOldCopy = [node copy]; -} - -- (void) modifyNodeCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange propertyChangeOfNode:nodeBeingModified - fromOld:nodeBeingModifiedOldCopy - toNew:[[nodeBeingModified copy] autorelease]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishModifySequence:(GraphChange*)change withName:(NSString*)chName cancelled:(BOOL)cancelled { - if (cancelled) { - change = [change invert]; - [graph applyGraphChange:change]; - [self regenerateTikz]; - [self postCancelledGraphChange:change]; - } else { - [self registerUndoGroupForChange:change withName:chName]; - [self regenerateTikz]; - [self postGraphChange:change]; - } -} - -- (void) _finishModifyNodeCancelled:(BOOL)cancelled { - if (nodeBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying a node"]; - } - - GraphChange *change = [GraphChange propertyChangeOfNode:nodeBeingModified - fromOld:nodeBeingModifiedOldCopy - toNew:[[nodeBeingModified copy] autorelease]]; - [self _finishModifySequence:change withName:@"Modify node" cancelled:cancelled]; - - [nodeBeingModified release]; - nodeBeingModified = nil; - [nodeBeingModifiedOldCopy release]; - nodeBeingModifiedOldCopy = nil; -} - -- (void) endModifyNode { [self _finishModifyNodeCancelled:NO]; } -- (void) cancelModifyNode { [self _finishModifyNodeCancelled:YES]; } - -- (void) startModifyNodes:(NSSet*)nodes { - if (nodesetBeingModified != nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Already modifying a node set"]; - } - - nodesetBeingModified = [nodes copy]; - nodesetBeingModifiedOldCopy = [[Graph nodeTableForNodes:nodes] retain]; -} - -- (void) modifyNodesCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange propertyChangeOfNodesFromOldCopies:nodesetBeingModifiedOldCopy - toNewCopies:[Graph nodeTableForNodes:nodesetBeingModified]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishModifyNodes:(BOOL)cancelled { - if (nodesetBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying a node set"]; - } - - GraphChange *change = [GraphChange propertyChangeOfNodesFromOldCopies:nodesetBeingModifiedOldCopy - toNewCopies:[Graph nodeTableForNodes:nodesetBeingModified]]; - [self _finishModifySequence:change withName:@"Modify nodes" cancelled:cancelled]; - - [nodesetBeingModified release]; - nodesetBeingModified = nil; - [nodesetBeingModifiedOldCopy release]; - nodesetBeingModifiedOldCopy = nil; -} - -- (void) endModifyNodes { [self _finishModifyNodes:NO]; } -- (void) cancelModifyNodes { [self _finishModifyNodes:YES]; } - -- (void) startShiftNodes:(NSSet*)nodes { - if (nodesetBeingModified != nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Already modifying a node set"]; - } - - nodesetBeingModified = [nodes copy]; - currentNodeShift = NSZeroPoint; -} - -- (void) shiftNodesUpdate:(NSPoint)currentShift { - if (nodesetBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying a node set"]; - } - - currentNodeShift = currentShift; - [self regenerateTikz]; - GraphChange *change = [GraphChange shiftNodes:nodesetBeingModified - byPoint:currentNodeShift]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishShiftNodesCancelled:(BOOL)cancelled { - if (nodesetBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying a node set"]; - } - - if (!NSEqualPoints (currentNodeShift, NSZeroPoint)) { - GraphChange *change = [GraphChange shiftNodes:nodesetBeingModified - byPoint:currentNodeShift]; - [self _finishModifySequence:change withName:@"Move nodes" cancelled:cancelled]; - } - - [nodesetBeingModified release]; - nodesetBeingModified = nil; -} - -- (void) endShiftNodes { [self _finishShiftNodesCancelled:NO]; } -- (void) cancelShiftNodes { [self _finishShiftNodesCancelled:YES]; } - -- (void) startModifyEdge:(Edge*)edge { - if (edgeBeingModified != nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Already modifying an edge"]; - } - edgeBeingModified = [edge retain]; - edgeBeingModifiedOldCopy = [edge copy]; -} - -- (void) modifyEdgeCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange propertyChangeOfEdge:edgeBeingModified - fromOld:edgeBeingModifiedOldCopy - toNew:[[edgeBeingModified copy] autorelease]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishModifyEdgeCancelled:(BOOL)cancelled { - if (edgeBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying an edge"]; - } - - GraphChange *change = [GraphChange propertyChangeOfEdge:edgeBeingModified - fromOld:edgeBeingModifiedOldCopy - toNew:[[edgeBeingModified copy] autorelease]]; - [self _finishModifySequence:change withName:@"Modify edge" cancelled:cancelled]; - - [edgeBeingModified release]; - edgeBeingModified = nil; - [edgeBeingModifiedOldCopy release]; - edgeBeingModifiedOldCopy = nil; -} - -- (void) endModifyEdge { [self _finishModifyEdgeCancelled:NO]; } -- (void) cancelModifyEdge { [self _finishModifyEdgeCancelled:YES]; } - -- (void) startModifyEdges:(NSSet*)edges { - if (edgesetBeingModified != nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Already modifying an edge set"]; - } - - edgesetBeingModified = [edges copy]; - edgesetBeingModifiedOldCopy = [[Graph edgeTableForEdges:edges] retain]; -} - -- (void) modifyEdgesCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange propertyChangeOfEdgesFromOldCopies:edgesetBeingModifiedOldCopy - toNewCopies:[Graph edgeTableForEdges:edgesetBeingModified]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishModifyEdgesCancelled:(BOOL)cancelled { - if (edgesetBeingModified == nil) { - [NSException raise:@"NSInternalInconsistencyException" format:@"Not modifying an edge"]; - } - - GraphChange *change = [GraphChange propertyChangeOfEdgesFromOldCopies:edgesetBeingModifiedOldCopy - toNewCopies:[Graph edgeTableForEdges:edgesetBeingModified]]; - [self _finishModifySequence:change withName:@"Modify edges" cancelled:cancelled]; - - [edgesetBeingModified release]; - edgesetBeingModified = nil; - [edgesetBeingModifiedOldCopy release]; - edgesetBeingModifiedOldCopy = nil; -} - -- (void) endModifyEdges { [self _finishModifyEdgesCancelled:NO]; } -- (void) cancelModifyEdges { [self _finishModifyEdgesCancelled:YES]; } - -- (void) startChangeBoundingBox { - oldGraphBounds = [graph boundingBox]; -} - -- (void) changeBoundingBoxCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange changeBoundingBoxFrom:oldGraphBounds - to:[graph boundingBox]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishChangeBoundingBoxCancelled:(BOOL)cancelled { - GraphChange *change = [GraphChange changeBoundingBoxFrom:oldGraphBounds - to:[graph boundingBox]]; - [self _finishModifySequence:change withName:@"Set bounding box" cancelled:cancelled]; -} -- (void) endChangeBoundingBox { [self _finishChangeBoundingBoxCancelled:NO]; } -- (void) cancelChangeBoundingBox { [self _finishChangeBoundingBoxCancelled:YES]; } - -- (void) startChangeGraphProperties { - oldGraphData = [[graph data] copy]; -} - -- (void) changeGraphPropertiesCheckPoint { - [self regenerateTikz]; - GraphChange *change = [GraphChange propertyChangeOfGraphFrom:oldGraphData - to:[graph data]]; - [self postIncompleteGraphChange:change]; -} - -- (void) _finishChangeGraphPropertiesCancelled:(BOOL)cancelled { - GraphChange *change = [GraphChange propertyChangeOfGraphFrom:oldGraphData - to:[graph data]]; - [self _finishModifySequence:change withName:@"Change graph properties" cancelled:cancelled]; - [oldGraphData release]; - oldGraphData = nil; -} -- (void) endChangeGraphProperties { [self _finishChangeGraphPropertiesCancelled:NO]; } -- (void) cancelChangeGraphProperties { [self _finishChangeGraphPropertiesCancelled:YES]; } - -- (void) removeSelected { - NSUInteger selEdges = [[pickSupport selectedEdges] count]; - NSUInteger selNodes = [[pickSupport selectedNodes] count]; - - if (selEdges == 0 && selNodes == 0) { - return; - } - - NSString *actionName = @"Remove selection"; - - [self startUndoGroup]; - if (selEdges > 0) { - GraphChange *change = [graph removeEdges:[pickSupport selectedEdges]]; - [self registerUndoForChange:change]; - [pickSupport deselectAllEdges]; - [self postGraphChange:change]; - } else { - actionName = (selNodes == 1 ? @"Remove node" : @"Remove nodes"); - } - if (selNodes > 0) { - GraphChange *change = [graph removeNodes:[pickSupport selectedNodes]]; - [self registerUndoForChange:change]; - [pickSupport deselectAllNodes]; - [self postGraphChange:change]; - } else { - actionName = (selEdges == 1 ? @"Remove edge" : @"Remove edges"); - } - [self nameAndEndUndoGroup:actionName]; - [self regenerateTikz]; -} - -- (void) addNode:(Node*)node { - GraphChange *change = [graph addNode:node]; - [self completedGraphChange:change withName:@"Add node"]; -} - -- (void) removeNode:(Node*)node { - [pickSupport deselectNode:node]; - GraphChange *change = [graph removeNode:node]; - [self completedGraphChange:change withName:@"Remove node"]; -} - -- (void) addEdge:(Edge*)edge { - GraphChange *change = [graph addEdge:edge]; - [self completedGraphChange:change withName:@"Add edge"]; -} - -- (void) removeEdge:(Edge*)edge { - [pickSupport deselectEdge:edge]; - GraphChange *change = [graph removeEdge:edge]; - [self completedGraphChange:change withName:@"Remove edge"]; -} - -- (void) shiftSelectedNodesByPoint:(NSPoint)offset { - if ([[pickSupport selectedNodes] count] > 0) { - GraphChange *change = [graph shiftNodes:[pickSupport selectedNodes] byPoint:offset]; - [self completedGraphChange:change withName:@"Move nodes"]; - } -} - -- (void) insertGraph:(Graph*)g { - GraphChange *change = [graph insertGraph:g]; - [self completedGraphChange:change withName:@"Insert graph"]; -} - -- (void) flipSelectedNodesHorizontally { - if ([[pickSupport selectedNodes] count] > 0) { - GraphChange *change = [graph flipHorizontalNodes:[pickSupport selectedNodes]]; - [self completedGraphChange:change withName:@"Flip nodes horizontally"]; - } -} - -- (void) flipSelectedNodesVertically { - if ([[pickSupport selectedNodes] count] > 0) { - GraphChange *change = [graph flipVerticalNodes:[pickSupport selectedNodes]]; - [self completedGraphChange:change withName:@"Flip nodes vertically"]; - } -} - -- (void) reverseSelectedEdges { - if ([[pickSupport selectedEdges] count] > 0) { - GraphChange *change = [graph reverseEdges:[pickSupport selectedEdges]]; - [self completedGraphChange:change withName:@"Reverse edges"]; - } -} - -- (void) bringSelectionForward { - BOOL hasNodeSelection = [[pickSupport selectedNodes] count] > 0; - BOOL hasEdgeSelection = [[pickSupport selectedEdges] count] > 0; - if (!hasNodeSelection && !hasEdgeSelection) - return; - - [self startUndoGroup]; - GraphChange *nodeChange; - GraphChange *edgeChange; - if (hasNodeSelection) { - nodeChange = [graph bringNodesForward:[pickSupport selectedNodes]]; - [self registerUndoForChange:nodeChange]; - } - if (hasEdgeSelection) { - edgeChange = [graph bringEdgesForward:[pickSupport selectedEdges]]; - [self registerUndoForChange:edgeChange]; - } - [self nameAndEndUndoGroup:@"Bring forward"]; - [self regenerateTikz]; - if (hasNodeSelection) - [self postGraphChange:nodeChange]; - if (hasEdgeSelection) - [self postGraphChange:edgeChange]; -} - -- (void) bringSelectionToFront { - BOOL hasNodeSelection = [[pickSupport selectedNodes] count] > 0; - BOOL hasEdgeSelection = [[pickSupport selectedEdges] count] > 0; - if (!hasNodeSelection && !hasEdgeSelection) - return; - - [self startUndoGroup]; - GraphChange *nodeChange; - GraphChange *edgeChange; - if (hasNodeSelection) { - nodeChange = [graph bringNodesToFront:[pickSupport selectedNodes]]; - [self registerUndoForChange:nodeChange]; - } - if (hasEdgeSelection) { - edgeChange = [graph bringEdgesToFront:[pickSupport selectedEdges]]; - [self registerUndoForChange:edgeChange]; - } - [self nameAndEndUndoGroup:@"Bring to front"]; - [self regenerateTikz]; - if (hasNodeSelection) - [self postGraphChange:nodeChange]; - if (hasEdgeSelection) - [self postGraphChange:edgeChange]; -} - -- (void) sendSelectionBackward { - BOOL hasNodeSelection = [[pickSupport selectedNodes] count] > 0; - BOOL hasEdgeSelection = [[pickSupport selectedEdges] count] > 0; - if (!hasNodeSelection && !hasEdgeSelection) - return; - - [self startUndoGroup]; - GraphChange *nodeChange; - GraphChange *edgeChange; - if (hasNodeSelection) { - nodeChange = [graph sendNodesBackward:[pickSupport selectedNodes]]; - [self registerUndoForChange:nodeChange]; - } - if (hasEdgeSelection) { - edgeChange = [graph sendNodesBackward:[pickSupport selectedEdges]]; - [self registerUndoForChange:edgeChange]; - } - [self nameAndEndUndoGroup:@"Send backward"]; - [self regenerateTikz]; - if (hasNodeSelection) - [self postGraphChange:nodeChange]; - if (hasEdgeSelection) - [self postGraphChange:edgeChange]; -} - -- (void) sendSelectionToBack { - BOOL hasNodeSelection = [[pickSupport selectedNodes] count] > 0; - BOOL hasEdgeSelection = [[pickSupport selectedEdges] count] > 0; - if (!hasNodeSelection && !hasEdgeSelection) - return; - - [self startUndoGroup]; - GraphChange *nodeChange; - GraphChange *edgeChange; - if (hasNodeSelection) { - nodeChange = [graph sendNodesToBack:[pickSupport selectedNodes]]; - [self registerUndoForChange:nodeChange]; - } - if (hasEdgeSelection) { - edgeChange = [graph sendNodesToBack:[pickSupport selectedEdges]]; - [self registerUndoForChange:edgeChange]; - } - [self nameAndEndUndoGroup:@"Send to back"]; - [self regenerateTikz]; - if (hasNodeSelection) - [self postGraphChange:nodeChange]; - if (hasEdgeSelection) - [self postGraphChange:edgeChange]; -} - -- (BOOL) saveCopyToPath: (NSString*)p error: (NSError**)error { - if (!p) { - [NSException raise:@"No document path" format:@"No path given"]; - } - // we use glib for writing the file, because GNUStep sucks in this regard - // (older versions don't have -[NSString writeToFile:atomically:encoding:error:]) - GError *gerror = NULL; - gchar *filename = [p glibFilename]; - BOOL success = g_file_set_contents (filename, [tikz UTF8String], -1, &gerror) ? YES : NO; - if (gerror) { - GErrorToNSError (gerror, error); - g_error_free (gerror); - } - g_free (filename); - return success; -} - -- (BOOL) saveToPath: (NSString*)p error: (NSError**)error { - BOOL success = [self saveCopyToPath:p error:error]; - if (success) { - [self setPath:p]; - hasChanges = NO; - } - return success; -} - -- (BOOL) save: (NSError**)error { - if (!path) { - [NSException raise:@"No document path" format:@"Tried to save a document when there was no path"]; - } - return [self saveToPath:path error:error]; -} - -@end - -@implementation TikzDocument (Private) -- (void) styleRenamed:(NSNotification*)n { - [self regenerateTikz]; -} - -- (void) setPath:(NSString*)p { - [p retain]; - [path release]; - path = p; -} - -- (void) setGraph:(Graph*)g { - if (g == nil) { - g = [Graph graph]; - } - if (g == graph) { - return; - } - - [pickSupport deselectAllNodes]; - [pickSupport deselectAllEdges]; - - [self startUndoGroup]; - [undoManager registerUndoWithTarget:self selector:@selector(setGraph:) object:graph]; - [g retain]; - [graph release]; - graph = g; - - [self attachStylesToGraph:graph]; - - [self regenerateTikz]; - [self postGraphReplaced]; - [self nameAndEndUndoGroup:@"Replace graph"]; -} - -- (void) registerUndoForChange:(GraphChange*)change { - [undoManager registerUndoWithTarget:self - selector:@selector(undoGraphChange:) - object:change]; -} - -- (void) registerUndoGroupForChange:(GraphChange*)change withName:(NSString*)nm { - [self startUndoGroup]; - [self registerUndoForChange:change]; - [self nameAndEndUndoGroup:nm]; -} - -- (void) undoGraphChange:(GraphChange*)change { - GraphChange *inverse = [change invert]; - [graph applyGraphChange:inverse]; - [self startUndoGroup]; - [undoManager registerUndoWithTarget:self - selector:@selector(undoGraphChange:) - object:inverse]; - [self endUndoGroup]; - [self regenerateTikz]; - [self postGraphChange:change]; -} - -- (void) completedGraphChange:(GraphChange*)change withName:(NSString*)name { - if (change == nil) { - NSLog(@"No graph change given for change %@", name); - return; - } - [self registerUndoGroupForChange:change withName:name]; - [self regenerateTikz]; - [self postGraphChange:change]; -} - -- (void) attachStylesToGraph:(Graph*)g { - for (Node *n in [g nodes]) { - [n attachStyleFromTable:[styleManager nodeStyles]]; - } - for (Edge *e in [g edges]) { - [e attachStyleFromTable:[styleManager edgeStyles]]; - } -} - -- (void) regenerateTikz { - [tikz release]; - tikz = [[graph tikz] retain]; - hasChanges = YES; - [self postTikzChanged]; -} -@end - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/Tool.h b/tikzit/src/gtk/Tool.h deleted file mode 100644 index 22c983e..0000000 --- a/tikzit/src/gtk/Tool.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "InputDelegate.h" -#import "Surface.h" - -#import <gtk/gtk.h> -#import <gdk-pixbuf/gdk-pixdata.h> - -@class Configuration; -@class GraphRenderer; -@protocol InputDelegate; -@protocol RenderDelegate; - -@protocol Tool <RenderDelegate,InputDelegate> -@property (readonly) NSString *name; -@property (readonly) const gchar *stockId; -@property (readonly) NSString *helpText; -@property (readonly) NSString *shortcut; -@property (retain) GraphRenderer *activeRenderer; -@property (readonly) GtkWidget *configurationWidget; -- (void) loadConfiguration:(Configuration*)config; -- (void) saveConfiguration:(Configuration*)config; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ToolBox.h b/tikzit/src/gtk/ToolBox.h deleted file mode 100644 index 60074c1..0000000 --- a/tikzit/src/gtk/ToolBox.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class Configuration; -@class Window; -@protocol Tool; - -@interface ToolBox : NSObject { - GtkWidget *window; - GtkToolItemGroup *toolGroup; - GtkWidget *titleLabel; - GtkWidget *configWidgetContainer; - GtkWidget *configWidget; -} - -@property (assign) id<Tool> selectedTool; - -- (id) initWithTools:(NSArray*)tools; - -- (void) show; -- (void) present; -- (void) attachToWindow:(Window*)parent; - -- (void) loadConfiguration:(Configuration*)config; -- (void) saveConfiguration:(Configuration*)config; -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/ToolBox.m b/tikzit/src/gtk/ToolBox.m deleted file mode 100644 index c6d2ccf..0000000 --- a/tikzit/src/gtk/ToolBox.m +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "ToolBox.h" - -#import "Application.h" -#import "Configuration.h" -#import "Tool.h" -#import "Window.h" - -#import "gtkhelpers.h" -#import "tztoolpalette.h" - -static void tool_button_toggled_cb (GtkWidget *widget, ToolBox *toolBox); - -#define TOOL_DATA_KEY "tikzit-tool" - -@implementation ToolBox - -- (id) init { - [self release]; - return nil; -} - -- (id) initWithTools:(NSArray*)tools { - self = [super init]; - - if (self) { - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_object_ref_sink (window); - gtk_window_set_title (GTK_WINDOW (window), "Toolbox"); - gtk_window_set_role (GTK_WINDOW (window), "toolbox"); - gtk_window_set_type_hint (GTK_WINDOW (window), - GDK_WINDOW_TYPE_HINT_UTILITY); - gtk_window_set_deletable (GTK_WINDOW (window), FALSE); - - GtkWidget *mainLayout = gtk_vbox_new (FALSE, 5); - gtk_widget_show (mainLayout); - gtk_container_add (GTK_CONTAINER (window), mainLayout); - - GtkWidget *toolPalette = tz_tool_palette_new (); - gtk_widget_show (toolPalette); - gtk_box_pack_start (GTK_BOX (mainLayout), - toolPalette, - FALSE, - FALSE, - 0); - gtk_tool_palette_set_style (GTK_TOOL_PALETTE (toolPalette), - GTK_TOOLBAR_ICONS); - - toolGroup = GTK_TOOL_ITEM_GROUP (gtk_tool_item_group_new ("Tools")); - g_object_ref_sink (G_OBJECT (toolGroup)); - gtk_tool_item_group_set_label_widget ( - toolGroup, - NULL); - gtk_container_add (GTK_CONTAINER (toolPalette), GTK_WIDGET (toolGroup)); - gtk_widget_show (GTK_WIDGET (toolGroup)); - - GSList *item_group = NULL; - for (id<Tool> tool in tools) { - NSString *tooltip = [NSString stringWithFormat: - @"%@: %@ (%@)", - [tool name], [tool helpText], [tool shortcut]]; - GtkToolItem *item = gtk_radio_tool_button_new_from_stock ( - item_group, - [tool stockId]); - gtk_tool_item_set_tooltip_text (item, [tooltip UTF8String]); - item_group = gtk_radio_tool_button_get_group ( - GTK_RADIO_TOOL_BUTTON (item)); - gtk_tool_item_group_insert ( - toolGroup, - item, - -1); - gtk_widget_show (GTK_WIDGET (item)); - g_object_set_data_full ( - G_OBJECT(item), - TOOL_DATA_KEY, - [tool retain], - release_obj); - - g_signal_connect (item, "toggled", - G_CALLBACK (tool_button_toggled_cb), - self); - } - - GtkWidget *sep = gtk_hseparator_new (); - gtk_widget_show (sep); - gtk_box_pack_start (GTK_BOX (mainLayout), - sep, - FALSE, - FALSE, - 0); - - titleLabel = gtk_label_new (""); - g_object_ref_sink (titleLabel); - gtk_widget_show (titleLabel); - - PangoAttrList *attrs = pango_attr_list_new (); - pango_attr_list_insert (attrs, - pango_attr_weight_new (PANGO_WEIGHT_SEMIBOLD)); - gtk_label_set_attributes (GTK_LABEL (titleLabel), attrs); - pango_attr_list_unref (attrs); - - gtk_box_pack_start (GTK_BOX (mainLayout), - titleLabel, - FALSE, - FALSE, - 0); - - configWidgetContainer = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); - g_object_ref_sink (configWidgetContainer); - gtk_widget_show (configWidgetContainer); - gtk_box_pack_start (GTK_BOX (mainLayout), - configWidgetContainer, - TRUE, - TRUE, - 0); - gtk_alignment_set_padding (GTK_ALIGNMENT (configWidgetContainer), - 5, 5, 5, 5); - - gint button_width; - gint button_height; - - if (tz_tool_palette_get_button_size (TZ_TOOL_PALETTE (toolPalette), - &button_width, &button_height)) - { - GdkGeometry geometry; - - geometry.min_width = 2 * button_width; - geometry.min_height = -1; - geometry.base_width = button_width; - geometry.base_height = 0; - geometry.width_inc = button_width; - geometry.height_inc = 1; - - gtk_window_set_geometry_hints (GTK_WINDOW (window), - NULL, - &geometry, - GDK_HINT_MIN_SIZE | - GDK_HINT_BASE_SIZE | - GDK_HINT_RESIZE_INC | - GDK_HINT_USER_POS); - } - gtk_window_set_default_size (GTK_WINDOW (window), button_width * 5, 500); - - // hack to position the toolbox window somewhere sensible - // (upper left) - gtk_window_parse_geometry (GTK_WINDOW (window), "+0+0"); - } - - return self; -} - -- (void) dealloc { - if (window) { - g_object_unref (G_OBJECT (toolGroup)); - g_object_unref (G_OBJECT (titleLabel)); - g_object_unref (G_OBJECT (configWidgetContainer)); - if (configWidget) - g_object_unref (G_OBJECT (configWidget)); - gtk_widget_destroy (window); - g_object_unref (G_OBJECT (window)); - } - - [super dealloc]; -} - -- (id<Tool>) selectedTool { - guint count = gtk_tool_item_group_get_n_items (toolGroup); - for (guint i = 0; i < count; ++i) { - GtkToolItem *item = gtk_tool_item_group_get_nth_item (toolGroup, i); - if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (item))) { - return (id)g_object_get_data (G_OBJECT (item), TOOL_DATA_KEY); - } - } - return nil; -} - -- (void) _setToolWidget:(GtkWidget*)widget { - if (configWidget) { - gtk_widget_hide (configWidget); - gtk_container_remove (GTK_CONTAINER (configWidgetContainer), - configWidget); - g_object_unref (configWidget); - } - configWidget = widget; - if (configWidget) { - g_object_ref (configWidget); - gtk_container_add (GTK_CONTAINER (configWidgetContainer), - configWidget); - gtk_widget_show (configWidget); - } -} - -- (void) setSelectedTool:(id<Tool>)tool { - guint count = gtk_tool_item_group_get_n_items (toolGroup); - for (guint i = 0; i < count; ++i) { - GtkToolItem *item = gtk_tool_item_group_get_nth_item (toolGroup, i); - id<Tool> data = (id)g_object_get_data (G_OBJECT (item), TOOL_DATA_KEY); - if (data == tool) { - gtk_toggle_tool_button_set_active ( - GTK_TOGGLE_TOOL_BUTTON (item), - TRUE); - break; - } - } - gtk_label_set_label (GTK_LABEL (titleLabel), - [[tool name] UTF8String]); - [self _setToolWidget:[tool configurationWidget]]; -} - -- (void) show { - gtk_widget_show (window); -} - -- (void) present { - gtk_window_present (GTK_WINDOW (window)); -} - -- (void) attachToWindow:(Window*)parent { - utility_window_attach (GTK_WINDOW (window), [parent gtkWindow]); -} - -- (void) loadConfiguration:(Configuration*)config { - if ([config hasGroup:@"ToolBox"]) { - tz_restore_window (GTK_WINDOW (window), - [config integerEntry:@"x" inGroup:@"ToolBox"], - [config integerEntry:@"y" inGroup:@"ToolBox"], - [config integerEntry:@"w" inGroup:@"ToolBox"], - [config integerEntry:@"h" inGroup:@"ToolBox"]); - } -} - -- (void) saveConfiguration:(Configuration*)config { - gint x, y, w, h; - - gtk_window_get_position (GTK_WINDOW (window), &x, &y); - gtk_window_get_size (GTK_WINDOW (window), &w, &h); - - [config setIntegerEntry:@"x" inGroup:@"ToolBox" value:x]; - [config setIntegerEntry:@"y" inGroup:@"ToolBox" value:y]; - [config setIntegerEntry:@"w" inGroup:@"ToolBox" value:w]; - [config setIntegerEntry:@"h" inGroup:@"ToolBox" value:h]; -} - -@end - -static void tool_button_toggled_cb (GtkWidget *widget, ToolBox *toolBox) { - if (gtk_toggle_tool_button_get_active (GTK_TOGGLE_TOOL_BUTTON (widget))) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<Tool> tool = (id)g_object_get_data (G_OBJECT(widget), TOOL_DATA_KEY); - [app setActiveTool:tool]; - NSDictionary *userInfo = [NSDictionary - dictionaryWithObject:tool - forKey:@"tool"]; - [[NSNotificationCenter defaultCenter] - postNotificationName:@"ToolSelectionChanged" - object:toolBox - userInfo:userInfo]; - - [pool drain]; - } -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/WidgetSurface.h b/tikzit/src/gtk/WidgetSurface.h deleted file mode 100644 index 667749f..0000000 --- a/tikzit/src/gtk/WidgetSurface.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> -#import <InputDelegate.h> -#import <Surface.h> - -/** - * Provides a surface for rendering to a widget. - */ -@interface WidgetSurface: NSObject <Surface> { - GtkWidget *widget; - Transformer *transformer; - id <RenderDelegate> renderDelegate; - id <InputDelegate> inputDelegate; - BOOL keepCentered; - BOOL buttonPressesRequired; - CGFloat defaultScale; - NSSize lastKnownSize; -} - -@property (assign) BOOL canFocus; -@property (assign) BOOL keepCentered; -@property (assign) CGFloat defaultScale; - -- (id) initWithWidget:(GtkWidget*)widget; -- (GtkWidget*) widget; - -- (id<InputDelegate>) inputDelegate; -- (void) setInputDelegate:(id<InputDelegate>)delegate; - -/** - * Set the minimum size that this widget wants - */ -- (void) setSizeRequestWidth:(double)width height:(double)height; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/WidgetSurface.m b/tikzit/src/gtk/WidgetSurface.m deleted file mode 100644 index 004e722..0000000 --- a/tikzit/src/gtk/WidgetSurface.m +++ /dev/null @@ -1,630 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "WidgetSurface.h" -#import "gtkhelpers.h" -#import "InputDelegate.h" -#import "CairoRenderContext.h" - -// {{{ Internal interfaces -// {{{ GTK+ callbacks -static gboolean configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, WidgetSurface *surface); -static void realize_cb (GtkWidget *widget, WidgetSurface *surface); -static gboolean expose_event_cb (GtkWidget *widget, GdkEventExpose *event, WidgetSurface *surface); -static gboolean button_press_event_cb (GtkWidget *widget, GdkEventButton *event, WidgetSurface *surface); -static gboolean button_release_event_cb (GtkWidget *widget, GdkEventButton *event, WidgetSurface *surface); -static gboolean motion_notify_event_cb (GtkWidget *widget, GdkEventMotion *event, WidgetSurface *surface); -static gboolean key_press_event_cb (GtkWidget *widget, GdkEventKey *event, WidgetSurface *surface); -static gboolean key_release_event_cb (GtkWidget *widget, GdkEventKey *event, WidgetSurface *surface); -static gboolean scroll_event_cb (GtkWidget *widget, GdkEventScroll *event, WidgetSurface *surface); -static void set_cursor (GtkWidget *widget, GdkCursor *cursor); -static void unref_cursor (gpointer cursor, GClosure *closure); -// }}} - -@interface WidgetSurface (Private) -- (void) updateTransformer; -- (void) widgetSizeChanged:(NSNotification*)notification; -- (void) handleExposeEvent:(GdkEventExpose*)event; -- (void) updateLastKnownSize; -- (void) zoomTo:(CGFloat)scale aboutPoint:(NSPoint)p; -- (void) zoomTo:(CGFloat)scale; -- (void) addToEventMask:(GdkEventMask)values; -- (void) removeFromEventMask:(GdkEventMask)values; -@end -// }}} -// {{{ API -@implementation WidgetSurface - -- (id) init { - return [self initWithWidget:gtk_drawing_area_new ()]; -} - -- (id) initWithWidget:(GtkWidget*)w { - self = [super init]; - - if (self) { - widget = w; - g_object_ref_sink (G_OBJECT (widget)); - defaultScale = 1.0f; - transformer = [[Transformer alloc] init]; - [transformer setFlippedAboutXAxis:YES]; - [self updateLastKnownSize]; - g_object_set (G_OBJECT (widget), "events", GDK_STRUCTURE_MASK, NULL); - g_signal_connect (widget, "expose-event", G_CALLBACK (expose_event_cb), self); - g_signal_connect (widget, "configure-event", G_CALLBACK (configure_event_cb), self); - g_signal_connect (widget, "realize", G_CALLBACK (realize_cb), self); - g_signal_connect (widget, "button-press-event", G_CALLBACK (button_press_event_cb), self); - g_signal_connect (widget, "button-release-event", G_CALLBACK (button_release_event_cb), self); - g_signal_connect (widget, "motion-notify-event", G_CALLBACK (motion_notify_event_cb), self); - g_signal_connect (widget, "key-press-event", G_CALLBACK (key_press_event_cb), self); - g_signal_connect (widget, "key-release-event", G_CALLBACK (key_release_event_cb), self); - g_signal_connect (widget, "scroll-event", G_CALLBACK (scroll_event_cb), self); - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(widgetSizeChanged:) - name:@"SurfaceSizeChanged" - object:self]; - if ([self canFocus]) { - [self addToEventMask:GDK_BUTTON_PRESS_MASK]; - } else { - [self removeFromEventMask:GDK_BUTTON_PRESS_MASK]; - } - } - - return self; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [transformer release]; - g_object_unref (G_OBJECT (widget)); - - [super dealloc]; -} - -- (void) invalidateRect:(NSRect)rect { - if (!NSIsEmptyRect (rect)) { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - GdkRectangle g_rect = gdk_rectangle_from_ns_rect (rect); - gdk_window_invalidate_rect (window, &g_rect, TRUE); - } - } -} - -- (void) invalidate { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - GdkRegion *visible = gdk_drawable_get_visible_region (GDK_DRAWABLE (window)); - gdk_window_invalidate_region (window, visible, TRUE); - gdk_region_destroy (visible); - } -} - -- (id<RenderContext>) createRenderContext { - return [CairoRenderContext contextForWidget:widget]; -} - -- (int) width { - int width = 0; - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - gdk_drawable_get_size (window, &width, NULL); - } - return width; -} - -- (int) height { - int height = 0; - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - gdk_drawable_get_size (window, NULL, &height); - } - return height; -} - -- (void) setSizeRequestWidth:(double)width height:(double)height { - gtk_widget_set_size_request (widget, width, height); -} - -- (Transformer*) transformer { - return transformer; -} - -- (GtkWidget*) widget { - return widget; -} - -- (void) setRenderDelegate:(id <RenderDelegate>)delegate { - // NB: no retention! - renderDelegate = delegate; - if (renderDelegate == nil) { - [self removeFromEventMask:GDK_EXPOSURE_MASK]; - } else { - [self addToEventMask:GDK_EXPOSURE_MASK]; - } -} - -- (id<InputDelegate>) inputDelegate { - return inputDelegate; -} - -- (void) setInputDelegate:(id<InputDelegate>)delegate { - if (delegate == inputDelegate) { - return; - } - buttonPressesRequired = NO; - if (inputDelegate != nil) { - [self removeFromEventMask:GDK_POINTER_MOTION_MASK - | GDK_BUTTON_PRESS_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_KEY_PRESS_MASK - | GDK_KEY_RELEASE_MASK]; - } - inputDelegate = delegate; - if (delegate != nil) { - GdkEventMask mask = 0; - if ([delegate respondsToSelector:@selector(mousePressAt:withButton:andMask:)]) { - buttonPressesRequired = YES; - mask |= GDK_BUTTON_PRESS_MASK; - } - if ([delegate respondsToSelector:@selector(mouseReleaseAt:withButton:andMask:)]) { - mask |= GDK_BUTTON_RELEASE_MASK; - } - if ([delegate respondsToSelector:@selector(mouseDoubleClickAt:withButton:andMask:)]) { - buttonPressesRequired = YES; - mask |= GDK_BUTTON_PRESS_MASK; - } - if ([delegate respondsToSelector:@selector(mouseMoveTo:withButtons:andMask:)]) { - mask |= GDK_POINTER_MOTION_MASK; - } - if ([delegate respondsToSelector:@selector(keyPressed:withMask:)]) { - mask |= GDK_KEY_PRESS_MASK; - } - if ([delegate respondsToSelector:@selector(keyReleased:withMask:)]) { - mask |= GDK_KEY_RELEASE_MASK; - } - [self addToEventMask:mask]; - } -} - -- (id <RenderDelegate>) renderDelegate { - return renderDelegate; -} - -- (void) setKeepCentered:(BOOL)centered { - keepCentered = centered; - [self updateTransformer]; -} - -- (BOOL) keepCentered { - return keepCentered; -} - -- (BOOL) canFocus { - return gtk_widget_get_can_focus (widget); -} - -- (void) setCanFocus:(BOOL)focus { - gtk_widget_set_can_focus (widget, focus); - if (focus) { - [self addToEventMask:GDK_BUTTON_PRESS_MASK]; - } else if (!buttonPressesRequired) { - [self removeFromEventMask:GDK_BUTTON_PRESS_MASK]; - } -} - -- (BOOL) hasFocus { - return gtk_widget_has_focus (widget); -} - -- (void) renderFocus { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - int width = 0; - int height = 0; - gdk_drawable_get_size (window, &width, &height); - gtk_paint_focus (gtk_widget_get_style (widget), - window, - GTK_STATE_NORMAL, - NULL, - widget, - NULL, - 0, - 0, - width, - height - ); - } -} - -- (CGFloat) defaultScale { - return defaultScale; -} - -- (void) setDefaultScale:(CGFloat)newDefault { - if (defaultScale != newDefault) { - CGFloat oldDefault = defaultScale; - defaultScale = newDefault; - - CGFloat scale = [transformer scale]; - scale *= (newDefault / oldDefault); - [transformer setScale:scale]; - [self invalidate]; - } -} - -- (void) zoomIn { - CGFloat scale = [transformer scale]; - scale *= 1.2f; - [self zoomTo:scale]; -} - -- (void) zoomOut { - CGFloat scale = [transformer scale]; - scale /= 1.2f; - [self zoomTo:scale]; -} - -- (void) zoomReset { - [self zoomTo:defaultScale]; -} - -- (void) zoomInAboutPoint:(NSPoint)p { - CGFloat scale = [transformer scale]; - scale *= 1.2f; - [self zoomTo:scale aboutPoint:p]; -} - -- (void) zoomOutAboutPoint:(NSPoint)p { - CGFloat scale = [transformer scale]; - scale /= 1.2f; - [self zoomTo:scale aboutPoint:p]; -} - -- (void) zoomResetAboutPoint:(NSPoint)p { - [self zoomTo:defaultScale aboutPoint:p]; -} - -- (void) setCursor:(Cursor)c { - GdkCursor *cursor = NULL; - switch (c) { - case ResizeRightCursor: - cursor = gdk_cursor_new (GDK_RIGHT_SIDE); - break; - case ResizeBottomRightCursor: - cursor = gdk_cursor_new (GDK_BOTTOM_RIGHT_CORNER); - break; - case ResizeBottomCursor: - cursor = gdk_cursor_new (GDK_BOTTOM_SIDE); - break; - case ResizeBottomLeftCursor: - cursor = gdk_cursor_new (GDK_BOTTOM_LEFT_CORNER); - break; - case ResizeLeftCursor: - cursor = gdk_cursor_new (GDK_LEFT_SIDE); - break; - case ResizeTopLeftCursor: - cursor = gdk_cursor_new (GDK_TOP_LEFT_CORNER); - break; - case ResizeTopCursor: - cursor = gdk_cursor_new (GDK_TOP_SIDE); - break; - case ResizeTopRightCursor: - cursor = gdk_cursor_new (GDK_TOP_RIGHT_CORNER); - break; - default: break; - } - GdkWindow *window = gtk_widget_get_window (widget); - g_signal_handlers_disconnect_matched (window, - G_SIGNAL_MATCH_FUNC, 0, 0, NULL, - G_CALLBACK (set_cursor), NULL); - if (window) { - gdk_window_set_cursor (window, cursor); - if (cursor != NULL) { - gdk_cursor_unref (cursor); - } - } else { - g_signal_connect_data (widget, - "realize", G_CALLBACK (set_cursor), cursor, - unref_cursor, 0); - } -} - -@end -// }}} -// {{{ Private -@implementation WidgetSurface (Private) -- (void) widgetSizeChanged:(NSNotification*)notification { - [self updateTransformer]; - [self updateLastKnownSize]; -} - -- (void) updateTransformer { - if (keepCentered) { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - int width = 0; - int height = 0; - gdk_drawable_get_size (window, &width, &height); - NSPoint origin; - if (lastKnownSize.width < 1 || lastKnownSize.height < 1) { - origin.x = (float)width / 2.0f; - origin.y = (float)height / 2.0f; - } else { - origin = [transformer origin]; - origin.x += ((float)width - lastKnownSize.width) / 2.0f; - origin.y += ((float)height - lastKnownSize.height) / 2.0f; - } - [transformer setOrigin:origin]; - } - } -} - -- (void) handleExposeEvent:(GdkEventExpose*)event { - if (renderDelegate != nil) { - NSRect area = gdk_rectangle_to_ns_rect (event->area); - - id<RenderContext> context = [CairoRenderContext contextForWidget:widget]; - [context rect:area]; - [context clipToPath]; - [renderDelegate renderWithContext:context onSurface:self]; - } -} - -- (void) updateLastKnownSize { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - int width = 0; - int height = 0; - gdk_drawable_get_size (window, &width, &height); - lastKnownSize.width = (float)width; - lastKnownSize.height = (float)height; - } else { - lastKnownSize = NSZeroSize; - } -} - -- (void) zoomTo:(CGFloat)scale aboutPoint:(NSPoint)p { - NSPoint graphP = [transformer fromScreen:p]; - - [transformer setScale:scale]; - - NSPoint newP = [transformer toScreen:graphP]; - NSPoint origin = [transformer origin]; - origin.x += p.x - newP.x; - origin.y += p.y - newP.y; - [transformer setOrigin:origin]; - - [self invalidate]; -} - -- (void) zoomTo:(CGFloat)scale { - NSPoint centre = NSMakePoint (lastKnownSize.width/2.0f, lastKnownSize.height/2.0f); - [self zoomTo:scale aboutPoint:centre]; -} - -- (void) addToEventMask:(GdkEventMask)values { - GdkEventMask mask; - g_object_get (G_OBJECT (widget), "events", &mask, NULL); - mask |= values; - g_object_set (G_OBJECT (widget), "events", mask, NULL); -} - -- (void) removeFromEventMask:(GdkEventMask)values { - GdkEventMask mask; - g_object_get (G_OBJECT (widget), "events", &mask, NULL); - mask ^= values; - if (buttonPressesRequired || [self canFocus]) { - mask |= GDK_BUTTON_PRESS_MASK; - } - g_object_set (G_OBJECT (widget), "events", mask, NULL); -} - -@end -// }}} -// {{{ GTK+ callbacks -static gboolean configure_event_cb(GtkWidget *widget, GdkEventConfigure *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"SurfaceSizeChanged" object:surface]; - [pool drain]; - return FALSE; -} - -static void realize_cb (GtkWidget *widget, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [surface updateTransformer]; - [pool drain]; -} - -static gboolean expose_event_cb(GtkWidget *widget, GdkEventExpose *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [surface handleExposeEvent:event]; - [pool drain]; - return FALSE; -} - -InputMask mask_from_gdk_modifier_state (GdkModifierType state) { - InputMask mask = 0; - if (state & GDK_SHIFT_MASK) { - mask |= ShiftMask; - } - if (state & GDK_CONTROL_MASK) { - mask |= ControlMask; - } - if (state & GDK_META_MASK) { - mask |= MetaMask; - } - return mask; -} - -ScrollDirection scroll_dir_from_gdk_scroll_dir (GdkScrollDirection dir) { - switch (dir) { - case GDK_SCROLL_UP: return ScrollUp; - case GDK_SCROLL_DOWN: return ScrollDown; - case GDK_SCROLL_LEFT: return ScrollLeft; - case GDK_SCROLL_RIGHT: return ScrollRight; - default: NSLog(@"Invalid scroll direction %i", (int)dir); return ScrollDown; - } -} - -MouseButton buttons_from_gdk_modifier_state (GdkModifierType state) { - MouseButton buttons = 0; - if (state & GDK_BUTTON1_MASK) { - buttons |= LeftButton; - } - if (state & GDK_BUTTON2_MASK) { - buttons |= MiddleButton; - } - if (state & GDK_BUTTON3_MASK) { - buttons |= RightButton; - } - if (state & GDK_BUTTON4_MASK) { - buttons |= Button4; - } - if (state & GDK_BUTTON5_MASK) { - buttons |= Button5; - } - return buttons; -} - -static gboolean button_press_event_cb(GtkWidget *widget, GdkEventButton *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - if ([surface canFocus]) { - if (!gtk_widget_has_focus (widget)) { - gtk_widget_grab_focus (widget); - } - } - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - NSPoint pos = NSMakePoint (event->x, event->y); - MouseButton button = (MouseButton)event->button; - InputMask mask = mask_from_gdk_modifier_state (event->state); - if (event->type == GDK_BUTTON_PRESS && [delegate respondsToSelector:@selector(mousePressAt:withButton:andMask:)]) { - [delegate mousePressAt:pos withButton:button andMask:mask]; - } - if (event->type == GDK_2BUTTON_PRESS && [delegate respondsToSelector:@selector(mouseDoubleClickAt:withButton:andMask:)]) { - [delegate mouseDoubleClickAt:pos withButton:button andMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static gboolean button_release_event_cb(GtkWidget *widget, GdkEventButton *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - if ([delegate respondsToSelector:@selector(mouseReleaseAt:withButton:andMask:)]) { - NSPoint pos = NSMakePoint (event->x, event->y); - MouseButton button = (MouseButton)event->button; - InputMask mask = mask_from_gdk_modifier_state (event->state); - [delegate mouseReleaseAt:pos withButton:button andMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static gboolean motion_notify_event_cb(GtkWidget *widget, GdkEventMotion *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - if ([delegate respondsToSelector:@selector(mouseMoveTo:withButtons:andMask:)]) { - NSPoint pos = NSMakePoint (event->x, event->y); - MouseButton buttons = buttons_from_gdk_modifier_state (event->state); - InputMask mask = mask_from_gdk_modifier_state (event->state); - [delegate mouseMoveTo:pos withButtons:buttons andMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static gboolean key_press_event_cb(GtkWidget *widget, GdkEventKey *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - if ([delegate respondsToSelector:@selector(keyPressed:withMask:)]) { - InputMask mask = mask_from_gdk_modifier_state (event->state); - [delegate keyPressed:event->keyval withMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static gboolean key_release_event_cb(GtkWidget *widget, GdkEventKey *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - if ([delegate respondsToSelector:@selector(keyReleased:withMask:)]) { - InputMask mask = mask_from_gdk_modifier_state (event->state); - [delegate keyReleased:event->keyval withMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static gboolean scroll_event_cb (GtkWidget *widget, GdkEventScroll *event, WidgetSurface *surface) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - id<InputDelegate> delegate = [surface inputDelegate]; - if (delegate != nil) { - if ([delegate respondsToSelector:@selector(mouseScrolledAt:inDirection:withMask:)]) { - NSPoint pos = NSMakePoint (event->x, event->y); - InputMask mask = mask_from_gdk_modifier_state (event->state); - ScrollDirection dir = scroll_dir_from_gdk_scroll_dir (event->direction); - [delegate mouseScrolledAt:pos - inDirection:dir - withMask:mask]; - } - } - - [pool drain]; - return FALSE; -} - -static void unref_cursor (gpointer cursor, GClosure *closure) { - if (cursor != NULL) { - gdk_cursor_unref ((GdkCursor*)cursor); - } -} - -static void set_cursor (GtkWidget *widget, GdkCursor *cursor) { - GdkWindow *window = gtk_widget_get_window (widget); - if (window) { - gdk_window_set_cursor (window, cursor); - if (cursor != NULL) { - gdk_cursor_unref (cursor); - } - } -} -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/Window.h b/tikzit/src/gtk/Window.h deleted file mode 100644 index a3ce8a4..0000000 --- a/tikzit/src/gtk/Window.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> - -@class GraphEditorPanel; -@class Menu; -@class PropertyPane; -@class Preambles; -@class PreambleEditor; -@class PreviewWindow; -@class SettingsDialog; -@class StyleManager; -@class StylesPane; -@class TikzDocument; -@protocol Tool; - -/** - * Manages a document window - */ -@interface Window: NSObject { - // GTK+ widgets - GtkWindow *window; - GtkTextBuffer *tikzBuffer; - GtkStatusbar *statusBar; - GtkPaned *tikzPaneSplitter; - GtkWidget *tikzPane; - - gulong clipboard_handler_id; - GtkTextTag *errorHighlightTag; // owned by tikzBuffer - - // Classes that manage parts of the window - Menu *menu; - GraphEditorPanel *graphPanel; - - PreviewWindow *previewWindow; - - // state variables - BOOL suppressTikzUpdates; - BOOL hasParseError; - - // the document displayed by the window - TikzDocument *document; -} - -/** - * The document displayed by the window - */ -@property (retain) TikzDocument *document; -@property (readonly) BOOL hasFocus; -@property (readonly) GtkWindow *gtkWindow; - -/** - * Create a window with an empty document - */ -- (id) init; -+ (id) window; - -/** - * Create a window with the given document - */ -- (id) initWithDocument:(TikzDocument*)doc; -+ (id) windowWithDocument:(TikzDocument*)doc; - -/** - * Present the window to the user - */ -- (void) present; - -/** - * Open a file, asking the user which file to open - */ -- (void) openFile; -/** - * Open a file - */ -- (BOOL) openFileAtPath:(NSString*)path; -/** - * Save the active document to the path it was opened from - * or last saved to, or ask the user where to save it. - */ -- (BOOL) saveActiveDocument; -/** - * Save the active document, asking the user where to save it. - */ -- (BOOL) saveActiveDocumentAs; -/** - * Save the active document as a shape, asking the user what to name it. - */ -- (void) saveActiveDocumentAsShape; - -/** - * Close the window. - * - * May terminate the application if this is the last window. - * - * Will ask for user confirmation if the document is not saved. - */ -- (void) close; - -/** - * Cut the current selection to the clipboard. - */ -- (void) selectionCutToClipboard; -/** - * Copy the current selection to the clipboard. - */ -- (void) selectionCopyToClipboard; -/** - * Paste from the clipboard to the appropriate place. - */ -- (void) pasteFromClipboard; - -/** - * The GTK+ window that this class manages. - */ -- (GtkWindow*) gtkWindow; -/** - * The menu for the window. - */ -- (Menu*) menu; - -/** - * Present an error to the user - * - * @param error the error to present - */ -- (void) presentError:(NSError*)error; -/** - * Present an error to the user - * - * @param error the error to present - * @param message a message to display with the error - */ -- (void) presentError:(NSError*)error withMessage:(NSString*)message; -/** - * Present an error to the user - * - * @param error the error to present - */ -- (void) presentGError:(GError*)error; -/** - * Present an error to the user - * - * @param error the error to present - * @param message a message to display with the error - */ -- (void) presentGError:(GError*)error withMessage:(NSString*)message; - -- (void) setActiveTool:(id<Tool>)tool; - -- (void) zoomIn; -- (void) zoomOut; -- (void) zoomReset; - -/** - * Show or update the preview window. - */ -- (void) presentPreview; -/** - * Show or update the preview window without it grabbing focus - */ -- (void) updatePreview; - -@end - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/Window.m b/tikzit/src/gtk/Window.m deleted file mode 100644 index 2d9e63a..0000000 --- a/tikzit/src/gtk/Window.m +++ /dev/null @@ -1,991 +0,0 @@ -/* - * Copyright 2011-2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "Window.h" - -#import <gtk/gtk.h> -#import "gtkhelpers.h" -#import "clipboard.h" - -#import "Application.h" -#import "Configuration.h" -#import "FileChooserDialog.h" -#import "GraphEditorPanel.h" -#import "Menu.h" -#import "RecentManager.h" -#import "Shape.h" -#import "SupportDir.h" -#import "TikzDocument.h" - -#ifdef HAVE_POPPLER -#import "PreviewWindow.h" -#endif - -enum { - GraphInfoStatus, - ParseStatus -}; - -// {{{ Internal interfaces -// {{{ Clipboard support - -static void clipboard_provide_data (GtkClipboard *clipboard, - GtkSelectionData *selection_data, - guint info, - gpointer clipboard_graph_data); -static void clipboard_release_data (GtkClipboard *clipboard, gpointer clipboard_graph_data); -static void clipboard_check_targets (GtkClipboard *clipboard, - GdkAtom *atoms, - gint n_atoms, - gpointer action); -static void clipboard_paste_contents (GtkClipboard *clipboard, - GtkSelectionData *selection_data, - gpointer document); - -// }}} -// {{{ Signals - -static void window_toplevel_focus_changed_cb (GObject *gobject, GParamSpec *pspec, Window *window); -static void graph_divider_position_changed_cb (GObject *gobject, GParamSpec *pspec, Window *window); -static void tikz_buffer_changed_cb (GtkTextBuffer *buffer, Window *window); -static gboolean main_window_delete_event_cb (GtkWidget *widget, GdkEvent *event, Window *window); -static void main_window_destroy_cb (GtkWidget *widget, Window *window); -static gboolean main_window_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, Window *window); -static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAction *action); - -// }}} - -@interface Window (Notifications) -- (void) tikzBufferChanged; -- (void) windowSizeChangedWidth:(int)width height:(int)height; -- (void) documentTikzChanged:(NSNotification*)notification; -- (void) documentSelectionChanged:(NSNotification*)notification; -- (void) undoStackChanged:(NSNotification*)notification; -@end - -@interface Window (InitHelpers) -- (void) _loadUi; -- (void) _restoreUiState; -- (void) _connectSignals; -@end - -@interface Window (Private) <PreviewHandler> -- (BOOL) _askCanClose; -/** Open a document, dealing with errors as necessary */ -- (TikzDocument*) _openDocument:(NSString*)path; -- (void) _placeGraphOnClipboard:(Graph*)graph; -- (void) _clearParseError; -- (void) _setParseError:(NSError*)error; -/** Update the window title. */ -- (void) _updateTitle; -/** Update the window status bar default text. */ -- (void) _updateStatus; -/** Update the displayed tikz code to match the active document. */ -- (void) _updateTikz; -/** Update the undo and redo actions to match the active document's - * undo stack. */ -- (void) _updateUndoActions; -- (void) showPreview; -@end - -// }}} -// {{{ API - -@implementation Window - -@synthesize gtkWindow=window; - -- (id) init { - return [self initWithDocument:[TikzDocument documentWithStyleManager:[app styleManager]]]; -} -+ (id) window { - return [[[self alloc] init] autorelease]; -} -- (id) initWithDocument:(TikzDocument*)doc { - self = [super init]; - - if (self) { - [self _loadUi]; - [self _restoreUiState]; - [self _connectSignals]; - - [self setDocument:doc]; - - gtk_widget_show (GTK_WIDGET (window)); - } - - return self; -} -+ (id) windowWithDocument:(TikzDocument*)doc { - return [[[self alloc] initWithDocument:doc] autorelease]; -} - -- (void) dealloc { - // The GTK+ window has already been destroyed at this point - - [[NSNotificationCenter defaultCenter] removeObserver:self]; - g_signal_handler_disconnect ( - gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), - clipboard_handler_id); - - [previewWindow release]; - [menu release]; - [graphPanel release]; - [document release]; - - g_object_unref (tikzBuffer); - g_object_unref (tikzPane); - g_object_unref (tikzPaneSplitter); - g_object_unref (statusBar); - g_object_unref (window); - - [super dealloc]; -} - -- (TikzDocument*) document { - return document; -} -- (void) setDocument:(TikzDocument*)newDoc { - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:[document pickSupport]]; - [[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:document]; - - TikzDocument *oldDoc = document; - document = [newDoc retain]; - - [graphPanel setDocument:document]; - [previewWindow setDocument:document]; - [self _updateTikz]; - [self _updateTitle]; - [self _updateStatus]; - [self _updateUndoActions]; - [menu notifySelectionChanged:[document pickSupport]]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(documentTikzChanged:) - name:@"TikzChanged" object:document]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(undoStackChanged:) - name:@"UndoStackChanged" object:document]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(documentSelectionChanged:) - name:@"NodeSelectionChanged" object:[document pickSupport]]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(documentSelectionChanged:) - name:@"EdgeSelectionChanged" object:[document pickSupport]]; - - if ([document path] != nil) { - [[RecentManager defaultManager] addRecentFile:[document path]]; - } - - NSDictionary *userInfo; - userInfo = [NSDictionary dictionaryWithObjectsAndKeys: - document, @"document", - oldDoc, @"oldDocument", - nil]; - [[NSNotificationCenter defaultCenter] - postNotificationName:@"DocumentChanged" - object:self - userInfo:userInfo]; - [oldDoc release]; -} - -- (BOOL) hasFocus { - return gtk_window_has_toplevel_focus (GTK_WINDOW (window)); -} - -- (void) present { - gtk_window_present (GTK_WINDOW (window)); -} - -- (void) openFile { - FileChooserDialog *dialog = [FileChooserDialog openDialogWithParent:window]; - [dialog addStandardFilters]; - if ([document path]) { - [dialog setCurrentFolder:[[document path] stringByDeletingLastPathComponent]]; - } else if ([app lastOpenFolder]) { - [dialog setCurrentFolder:[app lastOpenFolder]]; - } - - if ([dialog showDialog]) { - if ([self openFileAtPath:[dialog filePath]]) { - [app setLastOpenFolder:[dialog currentFolder]]; - } - } - [dialog destroy]; -} - -- (BOOL) openFileAtPath:(NSString*)path { - TikzDocument *doc = [self _openDocument:path]; - if (doc != nil) { - if (![document hasUnsavedChanges] && [document path] == nil) { - // we just have a fresh, untitled document - replace it - [self setDocument:doc]; - } else { - [app newWindowWithDocument:doc]; - } - return YES; - } - return NO; -} - -- (BOOL) saveActiveDocument { - if ([document path] == nil) { - return [self saveActiveDocumentAs]; - } else { - NSError *error = nil; - if (![document save:&error]) { - [self presentError:error]; - return NO; - } else { - [self _updateTitle]; - return YES; - } - } -} - -- (BOOL) saveActiveDocumentAs { - FileChooserDialog *dialog = [FileChooserDialog saveDialogWithParent:window]; - [dialog addStandardFilters]; - if ([document path] != nil) { - [dialog setCurrentFolder:[[document path] stringByDeletingLastPathComponent]]; - } else if ([app lastSaveAsFolder] != nil) { - [dialog setCurrentFolder:[app lastSaveAsFolder]]; - } - [dialog setSuggestedName:[document suggestedFileName]]; - - BOOL saved = NO; - if ([dialog showDialog]) { - NSString *nfile = [dialog filePath]; - - NSError *error = nil; - if (![document saveToPath:nfile error:&error]) { - [self presentError:error]; - } else { - [self _updateTitle]; - [[RecentManager defaultManager] addRecentFile:nfile]; - [app setLastSaveAsFolder:[dialog currentFolder]]; - saved = YES; - } - } - [dialog destroy]; - return saved; -} - -- (void) saveActiveDocumentAsShape { - GtkWidget *dialog = gtk_dialog_new_with_buttons ( - "Save as shape", - window, - GTK_DIALOG_MODAL, - GTK_STOCK_OK, - GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, - GTK_RESPONSE_REJECT, - NULL); - GtkBox *content = GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))); - GtkWidget *label1 = gtk_label_new ("Please choose a name for the shape"); - GtkWidget *label2 = gtk_label_new ("Name:"); - GtkWidget *input = gtk_entry_new (); - GtkBox *hbox = GTK_BOX (gtk_hbox_new (FALSE, 5)); - gtk_box_pack_start (hbox, label2, FALSE, TRUE, 0); - gtk_box_pack_start (hbox, input, TRUE, TRUE, 0); - gtk_box_pack_start (content, label1, TRUE, TRUE, 5); - gtk_box_pack_start (content, GTK_WIDGET (hbox), TRUE, TRUE, 5); - gtk_widget_show_all (GTK_WIDGET (content)); - gint response = gtk_dialog_run (GTK_DIALOG (dialog)); - while (response == GTK_RESPONSE_ACCEPT) { - response = GTK_RESPONSE_NONE; - NSDictionary *shapeDict = [Shape shapeDictionary]; - const gchar *dialogInput = gtk_entry_get_text (GTK_ENTRY (input)); - NSString *shapeName = [NSString stringWithUTF8String:dialogInput]; - BOOL doSave = NO; - if ([shapeName isEqual:@""]) { - GtkWidget *emptyStrDialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "You must specify a shape name"); - gtk_dialog_run (GTK_DIALOG (emptyStrDialog)); - gtk_widget_destroy (emptyStrDialog); - response = gtk_dialog_run (GTK_DIALOG (dialog)); - } else if ([shapeDict objectForKey:shapeName] != nil) { - GtkWidget *overwriteDialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_YES_NO, - "Do you want to replace the existing shape named '%s'?", - dialogInput); - gint overwriteResp = gtk_dialog_run (GTK_DIALOG (overwriteDialog)); - gtk_widget_destroy (overwriteDialog); - - if (overwriteResp == GTK_RESPONSE_YES) { - doSave = YES; - } else { - response = gtk_dialog_run (GTK_DIALOG (dialog)); - } - } else { - doSave = YES; - } - if (doSave) { - NSError *error = nil; - NSString *userShapeDir = [[SupportDir userSupportDir] stringByAppendingPathComponent:@"shapes"]; - NSString *file = [NSString stringWithFormat:@"%@/%@.tikz", userShapeDir, shapeName]; - if (![[NSFileManager defaultManager] ensureDirectoryExists:userShapeDir error:&error]) { - [self presentError:error withMessage:@"Could not create user shape directory"]; - } else { - if (![document saveCopyToPath:file error:&error]) { - [self presentError:error withMessage:@"Could not save shape file"]; - } else { - [Shape refreshShapeDictionary]; - } - } - } - } - gtk_widget_destroy (dialog); -} - -- (void) close { - if ([self _askCanClose]) { - gtk_widget_destroy (GTK_WIDGET (window)); - } -} - -- (void) selectionCutToClipboard { - if ([[[document pickSupport] selectedNodes] count] > 0) { - [self _placeGraphOnClipboard:[document selectionCut]]; - } -} - -- (void) selectionCopyToClipboard { - if ([[[document pickSupport] selectedNodes] count] > 0) { - [self _placeGraphOnClipboard:[document selectionCopy]]; - } -} - -- (void) pasteFromClipboard { - gtk_clipboard_request_contents (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD), - tikzit_picture_atom, - clipboard_paste_contents, - document); -} - -- (GtkWindow*) gtkWindow { - return window; -} - -- (Configuration*) mainConfiguration { - return [app mainConfiguration]; -} - -- (Menu*) menu { - return menu; -} - -- (void) presentError:(NSError*)error { - const gchar *errorDesc = "unknown error"; - if (error && [error localizedDescription]) { - errorDesc = [[error localizedDescription] UTF8String]; - } - GtkWidget *dialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", - errorDesc); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); -} - -- (void) presentError:(NSError*)error withMessage:(NSString*)message { - const gchar *errorDesc = "unknown error"; - if (error && [error localizedDescription]) { - errorDesc = [[error localizedDescription] UTF8String]; - } - GtkWidget *dialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s: %s", - [message UTF8String], - errorDesc); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); -} - -- (void) presentGError:(GError*)error { - const gchar *errorDesc = "unknown error"; - if (error && error->message) { - errorDesc = error->message; - } - GtkWidget *dialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", - errorDesc); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); -} - -- (void) presentGError:(GError*)error withMessage:(NSString*)message { - const gchar *errorDesc = "unknown error"; - if (error && error->message) { - errorDesc = error->message; - } - GtkWidget *dialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s: %s", - [message UTF8String], - errorDesc); - gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); -} - -- (void) setActiveTool:(id<Tool>)tool { - [graphPanel setActiveTool:tool]; - gboolean hasfocus; - g_object_get (G_OBJECT (window), "has-toplevel-focus", &hasfocus, NULL); - if (hasfocus) { - [graphPanel grabTool]; - } -} - -- (void) zoomIn { - [graphPanel zoomIn]; -} - -- (void) zoomOut { - [graphPanel zoomOut]; -} - -- (void) zoomReset { - [graphPanel zoomReset]; -} - -- (void) presentPreview { -#ifdef HAVE_POPPLER - if (previewWindow == nil) { - previewWindow = [[PreviewWindow alloc] initWithPreambles:[app preambles] - config:[app mainConfiguration]]; - //[previewWindow setParentWindow:self]; - [previewWindow setDocument:document]; - } - [previewWindow present]; -#endif -} - -- (void) updatePreview { -#ifdef HAVE_POPPLER - if (previewWindow == nil) { - previewWindow = [[PreviewWindow alloc] initWithPreambles:[app preambles] - config:[app mainConfiguration]]; - //[previewWindow setParentWindow:self]; - [previewWindow setDocument:document]; - } - [previewWindow show]; -#endif -} - -@end - -// }}} -// {{{ Notifications - -@implementation Window (Notifications) -- (void) graphHeightChanged:(int)newHeight { - [[app mainConfiguration] setIntegerEntry:@"graphHeight" - inGroup:@"window" - value:newHeight]; -} - -- (void) tikzBufferChanged { - if (!suppressTikzUpdates) { - suppressTikzUpdates = TRUE; - - GtkTextIter start, end; - gtk_text_buffer_get_bounds (tikzBuffer, &start, &end); - gchar *text = gtk_text_buffer_get_text (tikzBuffer, &start, &end, FALSE); - - NSError *error = nil; - BOOL success = [document updateTikz:[NSString stringWithUTF8String:text] error:&error]; - if (success) - [self _clearParseError]; - else - [self _setParseError:error]; - - g_free (text); - - suppressTikzUpdates = FALSE; - } -} - -- (void) windowSizeChangedWidth:(int)width height:(int)height { - if (width > 0 && height > 0) { - NSNumber *w = [NSNumber numberWithInt:width]; - NSNumber *h = [NSNumber numberWithInt:height]; - NSMutableArray *size = [NSMutableArray arrayWithCapacity:2]; - [size addObject:w]; - [size addObject:h]; - [[app mainConfiguration] setIntegerListEntry:@"windowSize" - inGroup:@"window" - value:size]; - } -} - -- (void) documentTikzChanged:(NSNotification*)notification { - [self _updateTitle]; - [self _updateTikz]; -} - -- (void) documentSelectionChanged:(NSNotification*)notification { - [self _updateStatus]; - [menu notifySelectionChanged:[document pickSupport]]; -} - -- (void) undoStackChanged:(NSNotification*)notification { - [self _updateUndoActions]; -} -@end - -// }}} -// {{{ InitHelpers - -@implementation Window (InitHelpers) - -- (void) _loadUi { - window = GTK_WINDOW (gtk_window_new (GTK_WINDOW_TOPLEVEL)); - g_object_ref_sink (window); - gtk_window_set_title (window, "TikZiT"); - gtk_window_set_default_size (window, 700, 400); - - GtkBox *mainLayout = GTK_BOX (gtk_vbox_new (FALSE, 0)); - gtk_widget_show (GTK_WIDGET (mainLayout)); - gtk_container_add (GTK_CONTAINER (window), GTK_WIDGET (mainLayout)); - - menu = [[Menu alloc] initForWindow:self]; - - GtkWidget *menubar = [menu menubar]; - gtk_box_pack_start (mainLayout, menubar, FALSE, TRUE, 0); - gtk_box_reorder_child (mainLayout, menubar, 0); - gtk_widget_show (menubar); - - tikzPaneSplitter = GTK_PANED (gtk_vpaned_new ()); - g_object_ref_sink (tikzPaneSplitter); - gtk_widget_show (GTK_WIDGET (tikzPaneSplitter)); - gtk_box_pack_start (mainLayout, GTK_WIDGET (tikzPaneSplitter), TRUE, TRUE, 0); - - graphPanel = [[GraphEditorPanel alloc] initWithDocument:document]; - [graphPanel setPreviewHandler:self]; - GtkWidget *graphEditorWidget = [graphPanel widget]; - gtk_widget_show (graphEditorWidget); - GtkWidget *graphFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (graphFrame), graphEditorWidget); - gtk_widget_show (graphFrame); - gtk_paned_pack1 (tikzPaneSplitter, graphFrame, TRUE, TRUE); - - tikzBuffer = gtk_text_buffer_new (NULL); - g_object_ref_sink (tikzBuffer); - errorHighlightTag = gtk_text_buffer_create_tag ( - tikzBuffer, NULL, - "foreground", "#d40000", - "foreground-set", TRUE, - "weight", PANGO_WEIGHT_SEMIBOLD, - "weight-set", TRUE, - NULL); - GtkWidget *tikzScroller = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (tikzScroller); - - tikzPane = gtk_text_view_new_with_buffer (tikzBuffer); - gtk_text_view_set_left_margin (GTK_TEXT_VIEW (tikzPane), 3); - gtk_text_view_set_right_margin (GTK_TEXT_VIEW (tikzPane), 3); - g_object_ref_sink (tikzPane); - gtk_widget_show (tikzPane); - gtk_container_add (GTK_CONTAINER (tikzScroller), tikzPane); - GtkWidget *tikzFrame = gtk_frame_new (NULL); - gtk_container_add (GTK_CONTAINER (tikzFrame), tikzScroller); - gtk_widget_show (tikzFrame); - gtk_paned_pack2 (tikzPaneSplitter, tikzFrame, FALSE, TRUE); - - statusBar = GTK_STATUSBAR (gtk_statusbar_new ()); - g_object_ref_sink (statusBar); - gtk_widget_show (GTK_WIDGET (statusBar)); - gtk_box_pack_start (mainLayout, GTK_WIDGET (statusBar), FALSE, TRUE, 0); - - GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - update_paste_action (clipboard, NULL, [menu pasteAction]); -} - -- (void) _restoreUiState { - Configuration *config = [app mainConfiguration]; - NSArray *windowSize = [config integerListEntry:@"windowSize" - inGroup:@"window"]; - if (windowSize && [windowSize count] == 2) { - gint width = [[windowSize objectAtIndex:0] intValue]; - gint height = [[windowSize objectAtIndex:1] intValue]; - if (width > 0 && height > 0) { - gtk_window_set_default_size (window, width, height); - } - } - int panePos = [config integerEntry:@"graphHeight" - inGroup:@"window"]; - if (panePos > 0) { - gtk_paned_set_position (tikzPaneSplitter, panePos); - } -} - -- (void) _connectSignals { - GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - clipboard_handler_id = - g_signal_connect (G_OBJECT (clipboard), - "owner-change", - G_CALLBACK (update_paste_action), - [menu pasteAction]); - g_signal_connect (G_OBJECT (window), - "key-press-event", - G_CALLBACK (tz_hijack_key_press), - NULL); - g_signal_connect (G_OBJECT (window), - "notify::has-toplevel-focus", - G_CALLBACK (window_toplevel_focus_changed_cb), - self); - g_signal_connect (G_OBJECT (tikzPaneSplitter), - "notify::position", - G_CALLBACK (graph_divider_position_changed_cb), - self); - g_signal_connect (G_OBJECT (tikzBuffer), - "changed", - G_CALLBACK (tikz_buffer_changed_cb), - self); - g_signal_connect (G_OBJECT (window), - "delete-event", - G_CALLBACK (main_window_delete_event_cb), - self); - g_signal_connect (G_OBJECT (window), - "destroy", - G_CALLBACK (main_window_destroy_cb), - self); - g_signal_connect (G_OBJECT (window), - "configure-event", - G_CALLBACK (main_window_configure_event_cb), - self); -} -@end - -// }}} -// {{{ Private - -@implementation Window (Private) - -- (BOOL) _askCanClose { - if ([document hasUnsavedChanges]) { - GtkWidget *dialog = gtk_message_dialog_new (window, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - "Save changes to the document \"%s\" before closing?", - [[document name] UTF8String]); - gtk_dialog_add_buttons (GTK_DIALOG (dialog), - "Save", GTK_RESPONSE_YES, - "Don't save", GTK_RESPONSE_NO, - "Cancel", GTK_RESPONSE_CANCEL, - NULL); - gint result = gtk_dialog_run (GTK_DIALOG (dialog)); - gtk_widget_destroy (dialog); - if (result == GTK_RESPONSE_YES) { - return [self saveActiveDocument]; - } else { - return result == GTK_RESPONSE_NO; - } - } else { - return YES; - } -} - -- (TikzDocument*) _openDocument:(NSString*)path { - NSError *error = nil; - TikzDocument *d = [TikzDocument documentFromFile:path - styleManager:[app styleManager] - error:&error]; - if (d != nil) { - return d; - } else { - if ([error code] == TZ_ERR_PARSE) { - [self presentError:error withMessage:@"Invalid file"]; - } else { - [self presentError:error withMessage:@"Could not open file"]; - } - [[RecentManager defaultManager] removeRecentFile:path]; - return nil; - } -} - -- (void) _placeGraphOnClipboard:(Graph*)graph { - GtkClipboard *clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); - - static const GtkTargetEntry targets[] = { - { "TIKZITPICTURE", 0, TARGET_TIKZIT_PICTURE }, - { "UTF8_STRING", 0, TARGET_UTF8_STRING } }; - - gtk_clipboard_set_with_data (clipboard, - targets, G_N_ELEMENTS (targets), - clipboard_provide_data, - clipboard_release_data, - clipboard_graph_data_new (graph)); -} - -- (void) _clearParseError { - if (!hasParseError) - return; - gtk_statusbar_pop (statusBar, ParseStatus); - text_buffer_clear_tag (tikzBuffer, errorHighlightTag); - widget_clear_error (tikzPane); - hasParseError = NO; -} - -- (void) _setParseError:(NSError*)error { - if (!hasParseError) { - widget_set_error (tikzPane); - hasParseError = YES; - } - NSString *message = [NSString stringWithFormat:@"Parse error: %@", [error localizedDescription]]; - gtk_statusbar_pop (statusBar, ParseStatus); - gtk_statusbar_push (statusBar, ParseStatus, [message UTF8String]); - - text_buffer_clear_tag (tikzBuffer, errorHighlightTag); - - NSDictionary *errorInfo = [error userInfo]; - if ([errorInfo objectForKey:@"startLine"] != nil) { - GtkTextIter symbolStart; - GtkTextIter symbolEnd; - gtk_text_buffer_get_iter_at_line_index (tikzBuffer, &symbolStart, - [[errorInfo objectForKey:@"startLine"] intValue] - 1, - [[errorInfo objectForKey:@"startColumn"] intValue] - 1); - gtk_text_buffer_get_iter_at_line_index (tikzBuffer, &symbolEnd, - [[errorInfo objectForKey:@"endLine"] intValue] - 1, - [[errorInfo objectForKey:@"endColumn"] intValue]); - gtk_text_buffer_apply_tag (tikzBuffer, errorHighlightTag, - &symbolStart, &symbolEnd); - } -} - -- (void) _updateUndoActions { - [menu setUndoActionEnabled:[document canUndo]]; - [menu setUndoActionDetail:[document undoName]]; - - [menu setRedoActionEnabled:[document canRedo]]; - [menu setRedoActionDetail:[document redoName]]; -} - -- (void) _updateTitle { - NSString *title = [NSString stringWithFormat:@"TikZiT - %@%s", - [document name], - ([document hasUnsavedChanges] ? "*" : "")]; - gtk_window_set_title(window, [title UTF8String]); -} - -- (void) _updateStatus { - // FIXME: show tooltips or something instead - GString *buffer = g_string_sized_new (30); - gchar *nextNode = 0; - - for (Node *n in [[document pickSupport] selectedNodes]) { - if (nextNode) { - if (buffer->len == 0) { - g_string_printf(buffer, "Nodes %s", nextNode); - } else { - g_string_append_printf(buffer, ", %s", nextNode); - } - } - nextNode = (gchar *)[[n name] UTF8String]; - } - if (nextNode) { - if (buffer->len == 0) { - g_string_printf(buffer, "Node %s is selected", nextNode); - } else { - g_string_append_printf(buffer, " and %s are selected", nextNode); - } - } - - if (buffer->len == 0) { - int nrNodes = [[[document graph] nodes] count]; - int nrEdges = [[[document graph] edges] count]; - g_string_printf(buffer, "Graph has %d node%s and %d edge%s", - nrNodes, - nrNodes!=1 ? "s" : "", - nrEdges, - nrEdges!=1 ? "s" : ""); - } - gtk_statusbar_pop(statusBar, GraphInfoStatus); - gtk_statusbar_push(statusBar, GraphInfoStatus, buffer->str); - - g_string_free (buffer, TRUE); -} - -- (void) _updateTikz { - if (document != nil && !suppressTikzUpdates) { - suppressTikzUpdates = TRUE; - - if (document != nil) { - const char *tikzString = [[document tikz] UTF8String]; - gtk_text_buffer_set_text (tikzBuffer, tikzString, -1); - } else { - gtk_text_buffer_set_text (tikzBuffer, "", -1); - } - [self _clearParseError]; - - suppressTikzUpdates = FALSE; - } -} - -- (GraphEditorPanel*) _graphPanel { - return graphPanel; -} - -- (void) showPreview { - [self updatePreview]; -} - -@end - -// }}} -// {{{ GTK+ callbacks - -static void window_toplevel_focus_changed_cb (GObject *gobject, GParamSpec *pspec, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - gboolean hasfocus; - g_object_get (gobject, "has-toplevel-focus", &hasfocus, NULL); - if (hasfocus) { - [[NSNotificationCenter defaultCenter] - postNotificationName:@"WindowGainedFocus" - object:window]; - [[window _graphPanel] grabTool]; - } else { - [[NSNotificationCenter defaultCenter] - postNotificationName:@"WindowLostFocus" - object:window]; - } - [pool drain]; -} - -static void graph_divider_position_changed_cb (GObject *gobject, GParamSpec *pspec, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - gint position; - g_object_get (gobject, "position", &position, NULL); - [window graphHeightChanged:position]; - [pool drain]; -} - -static void tikz_buffer_changed_cb (GtkTextBuffer *buffer, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window tikzBufferChanged]; - [pool drain]; -} - -static gboolean main_window_delete_event_cb (GtkWidget *widget, GdkEvent *event, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window close]; - [pool drain]; - return TRUE; -} - -static void main_window_destroy_cb (GtkWidget *widget, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [[NSNotificationCenter defaultCenter] postNotificationName:@"WindowClosed" - object:window]; - [pool drain]; -} - -static gboolean main_window_configure_event_cb (GtkWidget *widget, GdkEventConfigure *event, Window *window) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - [window windowSizeChangedWidth:event->width height:event->height]; - [pool drain]; - return FALSE; -} - -static void clipboard_provide_data (GtkClipboard *clipboard, - GtkSelectionData *selection_data, - guint info, - gpointer clipboard_graph_data) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - ClipboardGraphData *data = (ClipboardGraphData*)clipboard_graph_data; - if (info == TARGET_UTF8_STRING || info == TARGET_TIKZIT_PICTURE) { - clipboard_graph_data_convert (data); - GdkAtom target = (info == TARGET_UTF8_STRING) ? utf8_atom : tikzit_picture_atom; - gtk_selection_data_set (selection_data, - target, - 8*sizeof(gchar), - (guchar*)data->tikz, - data->tikz_length); - } - - [pool drain]; -} - -static void clipboard_release_data (GtkClipboard *clipboard, gpointer data) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - clipboard_graph_data_free ((ClipboardGraphData*)data); - [pool drain]; -} - -static void clipboard_check_targets (GtkClipboard *clipboard, - GdkAtom *atoms, - gint n_atoms, - gpointer action) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - gboolean found = FALSE; - for (gint i = 0; i < n_atoms; ++i) { - if (atoms[i] == tikzit_picture_atom) { - found = TRUE; - break; - } - } - gtk_action_set_sensitive (GTK_ACTION (action), found); - - [pool drain]; -} - -static void update_paste_action (GtkClipboard *clipboard, GdkEvent *event, GtkAction *action) { - gtk_action_set_sensitive (action, FALSE); - gtk_clipboard_request_targets (clipboard, clipboard_check_targets, action); -} - -static void clipboard_paste_contents (GtkClipboard *clipboard, - GtkSelectionData *selection_data, - gpointer document) { - NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - - TikzDocument *doc = (TikzDocument*)document; - gint length = gtk_selection_data_get_length (selection_data); - if (length >= 0) { - const guchar *raw_data = gtk_selection_data_get_data (selection_data); - gchar *data = g_new (gchar, length+1); - g_strlcpy (data, (const gchar *)raw_data, length+1); - NSString *tikz = [NSString stringWithUTF8String:data]; - if (tikz != nil) { - [doc pasteFromTikz:tikz]; - } - g_free (data); - } - - [pool drain]; -} - -// }}} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/cairo_helpers.h b/tikzit/src/gtk/cairo_helpers.h deleted file mode 100644 index e95357b..0000000 --- a/tikzit/src/gtk/cairo_helpers.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import "RColor.h" -#import <cairo/cairo.h> - -void cairo_ns_rectangle (cairo_t* cr, NSRect rect); -void cairo_set_source_rcolor (cairo_t* cr, RColor color); - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/cairo_helpers.m b/tikzit/src/gtk/cairo_helpers.m deleted file mode 100644 index 104e686..0000000 --- a/tikzit/src/gtk/cairo_helpers.m +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2011 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "cairo_helpers.h" - -void cairo_ns_rectangle (cairo_t* cr, NSRect rect) { - cairo_rectangle (cr, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); -} - -void cairo_set_source_rcolor (cairo_t* cr, RColor color) { - cairo_set_source_rgba (cr, color.red, color.green, color.blue, color.alpha); -} - -// vim:ft=objc:sts=4:sw=4:et diff --git a/tikzit/src/gtk/clipboard.h b/tikzit/src/gtk/clipboard.h deleted file mode 100644 index 568fc50..0000000 --- a/tikzit/src/gtk/clipboard.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "TZFoundation.h" -#import <gtk/gtk.h> -#import <Graph.h> - -enum { - TARGET_UTF8_STRING, - TARGET_TIKZIT_PICTURE -}; -typedef struct -{ - Graph *graph; - gchar *tikz; - gint tikz_length; -} ClipboardGraphData; - -extern GdkAtom utf8_atom; -extern GdkAtom tikzit_picture_atom; - -void clipboard_init (); -ClipboardGraphData *clipboard_graph_data_new (Graph *graph); -void clipboard_graph_data_free (ClipboardGraphData *data); -void clipboard_graph_data_convert (ClipboardGraphData *data); - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/clipboard.m b/tikzit/src/gtk/clipboard.m deleted file mode 100644 index 7001717..0000000 --- a/tikzit/src/gtk/clipboard.m +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2011 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "clipboard.h" - -GdkAtom utf8_atom; -GdkAtom tikzit_picture_atom; - -void clipboard_init () { - if (utf8_atom == GDK_NONE) { - utf8_atom = gdk_atom_intern ("UTF8_STRING", FALSE); - } - if (tikzit_picture_atom == GDK_NONE) { - tikzit_picture_atom = gdk_atom_intern ("TIKZITPICTURE", FALSE); - } -} - -ClipboardGraphData *clipboard_graph_data_new (Graph *graph) { - ClipboardGraphData *data = g_new (ClipboardGraphData, 1); - data->graph = [graph retain]; - data->tikz = NULL; - data->tikz_length = 0; - return data; -} - -void clipboard_graph_data_free (ClipboardGraphData *data) { - [data->graph release]; - if (data->tikz) { - g_free (data->tikz); - } - g_free (data); -} - -void clipboard_graph_data_convert (ClipboardGraphData *data) { - if (data->graph != nil && !data->tikz) { - data->tikz = g_strdup ([[data->graph tikz] UTF8String]); - data->tikz_length = strlen (data->tikz); - [data->graph release]; - data->graph = nil; - } -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/gtkhelpers.h b/tikzit/src/gtk/gtkhelpers.h deleted file mode 100644 index e4b79b8..0000000 --- a/tikzit/src/gtk/gtkhelpers.h +++ /dev/null @@ -1,60 +0,0 @@ -// -// gtkhelpers.h -// TikZiT -// -// Copyright 2010 Alex Merry. All rights reserved. -// -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// -#import "TZFoundation.h" -#include <gtk/gtk.h> -#import <gdk-pixbuf/gdk-pixbuf.h> - -/** - * Releases the Objective-C object pointed to by data - * - * Intended for use as a cleanup function in Glib/GObject-based - * code. - */ -void release_obj (gpointer data); - -NSString * gtk_editable_get_string (GtkEditable *editable, gint start, gint end); - -GdkRectangle gdk_rectangle_from_ns_rect (NSRect rect); -NSRect gdk_rectangle_to_ns_rect (GdkRectangle rect); - -void gtk_action_set_detailed_label (GtkAction *action, const gchar *baseLabel, const gchar *actionName); - -gint tz_hijack_key_press (GtkWindow *win, - GdkEventKey *event, - gpointer user_data); - -// Equivalent of GTK+3's gdk_pixbuf_get_from_surface() -GdkPixbuf * pixbuf_get_from_surface(cairo_surface_t *surface); - -void tz_restore_window (GtkWindow *window, gint x, gint y, gint w, gint h); - -void label_set_bold (GtkLabel *label); - -void widget_set_error (GtkWidget *widget); -void widget_clear_error (GtkWidget *widget); - -void text_buffer_clear_tag (GtkTextBuffer *buffer, GtkTextTag *tag); - -void utility_window_attach (GtkWindow *util_win, GtkWindow *parent_win); - -// vim:ft=objc:sts=2:sw=2:et diff --git a/tikzit/src/gtk/gtkhelpers.m b/tikzit/src/gtk/gtkhelpers.m deleted file mode 100644 index 9d26af5..0000000 --- a/tikzit/src/gtk/gtkhelpers.m +++ /dev/null @@ -1,275 +0,0 @@ -// -// gtkhelpers.h -// TikZiT -// -// Copyright 2010 Alex Merry. All rights reserved. -// -// Some code from Glade: -// Copyright 2001 Ximian, Inc. -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// -#import "gtkhelpers.h" -#import <gdk/gdkkeysyms.h> - -void release_obj (gpointer data) { - id obj = (id)data; - [obj release]; -} - -NSString * gtk_editable_get_string (GtkEditable *editable, gint start, gint end) -{ - gchar *text = gtk_editable_get_chars (editable, start, end); - NSString *string = [NSString stringWithUTF8String:text]; - g_free (text); - return string; -} - -GdkRectangle gdk_rectangle_from_ns_rect (NSRect box) { - GdkRectangle rect; - rect.x = box.origin.x; - rect.y = box.origin.y; - rect.width = box.size.width; - rect.height = box.size.height; - return rect; -} - -NSRect gdk_rectangle_to_ns_rect (GdkRectangle rect) { - NSRect result; - result.origin.x = rect.x; - result.origin.y = rect.y; - result.size.width = rect.width; - result.size.height = rect.height; - return result; -} - -void gtk_action_set_detailed_label (GtkAction *action, const gchar *baseLabel, const gchar *actionName) { - if (actionName == NULL || *actionName == '\0') { - gtk_action_set_label (action, baseLabel); - } else { - GString *label = g_string_sized_new (30); - g_string_printf(label, "%s: %s", baseLabel, actionName); - gtk_action_set_label (action, label->str); - g_string_free (label, TRUE); - } -} - -/** - * tz_hijack_key_press: - * @win: a #GtkWindow - * event: the GdkEventKey - * user_data: unused - * - * This function is meant to be attached to key-press-event of a toplevel, - * it simply allows the window contents to treat key events /before/ - * accelerator keys come into play (this way widgets dont get deleted - * when cutting text in an entry etc.). - * - * Returns: whether the event was handled - */ -gint -tz_hijack_key_press (GtkWindow *win, - GdkEventKey *event, - gpointer user_data) -{ - GtkWidget *focus_widget; - - focus_widget = gtk_window_get_focus (win); - if (focus_widget && - (event->keyval == GDK_Delete || /* Filter Delete from accelerator keys */ - ((event->state & GDK_CONTROL_MASK) && /* CTRL keys... */ - ((event->keyval == GDK_c || event->keyval == GDK_C) || /* CTRL-C (copy) */ - (event->keyval == GDK_x || event->keyval == GDK_X) || /* CTRL-X (cut) */ - (event->keyval == GDK_v || event->keyval == GDK_V) || /* CTRL-V (paste) */ - (event->keyval == GDK_a || event->keyval == GDK_A) || /* CTRL-A (select-all) */ - (event->keyval == GDK_n || event->keyval == GDK_N))))) /* CTRL-N (new document) ?? */ - { - return gtk_widget_event (focus_widget, - (GdkEvent *)event); - } - return FALSE; -} - -GdkPixbuf * pixbuf_get_from_surface(cairo_surface_t *surface) { - cairo_surface_flush (surface); - - int width = cairo_image_surface_get_width (surface); - int height = cairo_image_surface_get_height (surface); - int stride = cairo_image_surface_get_stride (surface); - unsigned char *data = cairo_image_surface_get_data (surface); - - GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, - TRUE, - 8, - width, - height); - unsigned char *pbdata = gdk_pixbuf_get_pixels (pixbuf); - int pbstride = gdk_pixbuf_get_rowstride (pixbuf); - - for (int y = 0; y < height; ++y) { - uint32_t *line = (uint32_t*)(data + y*stride); - unsigned char *pbline = pbdata + (y*pbstride); - for (int x = 0; x < width; ++x) { - uint32_t pixel = *(line + x); - unsigned char *pbpixel = pbline + (x*4); - // NB: We should un-pre-mult the alpha here. - // However, in our world, alpha is always - // on or off, so it doesn't really matter - pbpixel[3] = ((pixel & 0xff000000) >> 24); - pbpixel[0] = ((pixel & 0x00ff0000) >> 16); - pbpixel[1] = ((pixel & 0x0000ff00) >> 8); - pbpixel[2] = (pixel & 0x000000ff); - } - } - - return pixbuf; -} - -/* This function mostly lifted from - * gtk+/gdk/gdkscreen.c:gdk_screen_get_monitor_at_window() - */ -static gint -get_appropriate_monitor (GdkScreen *screen, - gint x, - gint y, - gint w, - gint h) -{ - GdkRectangle rect; - gint area = 0; - gint monitor = -1; - gint num_monitors; - gint i; - - rect.x = x; - rect.y = y; - rect.width = w; - rect.height = h; - - num_monitors = gdk_screen_get_n_monitors (screen); - - for (i = 0; i < num_monitors; i++) - { - GdkRectangle geometry; - - gdk_screen_get_monitor_geometry (screen, i, &geometry); - - if (gdk_rectangle_intersect (&rect, &geometry, &geometry) && - geometry.width * geometry.height > area) - { - area = geometry.width * geometry.height; - monitor = i; - } - } - - if (monitor >= 0) - return monitor; - else - return gdk_screen_get_monitor_at_point (screen, - rect.x + rect.width / 2, - rect.y + rect.height / 2); -} - -/* This function mostly lifted from gimp_session_info_apply_geometry - * in gimp-2.6/app/widgets/gimpsessioninfo.c - */ -void tz_restore_window (GtkWindow *window, gint x, gint y, gint w, gint h) -{ - gint forced_w = w; - gint forced_h = h; - if (w <= 0 || h <= 0) { - gtk_window_get_default_size (window, &w, &h); - } - if (w <= 0 || h <= 0) { - gtk_window_get_size (window, &w, &h); - } - - GdkScreen *screen = gtk_widget_get_screen (GTK_WIDGET (window)); - - gint monitor = 0; - if (w > 0 && h > 0) { - monitor = get_appropriate_monitor (screen, x, y, w, h); - } else { - monitor = gdk_screen_get_monitor_at_point (screen, x, y); - } - - GdkRectangle rect; - gdk_screen_get_monitor_geometry (screen, monitor, &rect); - - x = CLAMP (x, - rect.x, - rect.x + rect.width - (w > 0 ? w : 128)); - y = CLAMP (y, - rect.y, - rect.y + rect.height - (h > 0 ? h : 128)); - - gchar geom[32]; - g_snprintf (geom, sizeof (geom), "%+d%+d", x, y); - - gtk_window_parse_geometry (window, geom); - - if (forced_w > 0 && forced_h > 0) { - gtk_window_set_default_size (window, forced_w, forced_h); - } -} - -void label_set_bold (GtkLabel *label) { - PangoAttrList *attrs = pango_attr_list_new (); - pango_attr_list_insert (attrs, - pango_attr_weight_new (PANGO_WEIGHT_SEMIBOLD)); - gtk_label_set_attributes (label, attrs); - pango_attr_list_unref (attrs); -} - -void widget_set_error (GtkWidget *widget) { - GdkColor color = {0, 65535, 61184, 61184}; - gtk_widget_modify_base (widget, GTK_STATE_NORMAL, &color); -} - -void widget_clear_error (GtkWidget *widget) { - gtk_widget_modify_base (widget, GTK_STATE_NORMAL, NULL); -} - -void text_buffer_clear_tag (GtkTextBuffer *buffer, GtkTextTag *tag) { - GtkTextIter start; - GtkTextIter end; - gtk_text_buffer_get_start_iter (buffer, &start); - gtk_text_buffer_get_end_iter (buffer, &end); - gtk_text_buffer_remove_tag (buffer, tag, &start, &end); -} - -void utility_window_attach (GtkWindow *util_win, GtkWindow *parent_win) { - if (parent_win == gtk_window_get_transient_for (util_win)) - return; - - // HACK: X window managers tend to move windows around when they are - // unmapped and mapped again, so we save the position - gint x, y; - gtk_window_get_position (util_win, &x, &y); - - // HACK: Altering WM_TRANSIENT_FOR on a non-hidden but unmapped window - // (eg: when you have minimised the original parent window) can - // cause the window to be lost forever, so we hide it first - gtk_widget_hide (GTK_WIDGET (util_win)); - gtk_window_set_focus_on_map (util_win, FALSE); - gtk_window_set_transient_for (util_win, parent_win); - gtk_widget_show (GTK_WIDGET (util_win)); - - // HACK: see above - gtk_window_move (util_win, x, y); -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/logo.h b/tikzit/src/gtk/logo.h deleted file mode 100644 index e778da9..0000000 --- a/tikzit/src/gtk/logo.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#include <gdk-pixbuf/gdk-pixbuf.h> - -typedef enum { - LOGO_SIZE_16, - LOGO_SIZE_24, - LOGO_SIZE_32, - LOGO_SIZE_48, - LOGO_SIZE_64, - LOGO_SIZE_128, - LOGO_SIZE_COUNT -} LogoSize; - -GdkPixbuf *get_logo (LogoSize size); - -// vim:ft=objc:ts=8:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/logo.m b/tikzit/src/gtk/logo.m deleted file mode 100644 index 57533c7..0000000 --- a/tikzit/src/gtk/logo.m +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#import "logo.h" -#include <gdk-pixbuf/gdk-pixdata.h> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpointer-sign" -#import "logodata.m" -#pragma GCC diagnostic pop - -static GdkPixbuf *pixbufCache[LOGO_SIZE_COUNT]; - -GdkPixbuf *get_logo (LogoSize size) { - const GdkPixdata *data = NULL; - switch (size) { - case LOGO_SIZE_16: - data = &logo16; - break; - case LOGO_SIZE_24: - data = &logo24; - break; - case LOGO_SIZE_32: - data = &logo32; - break; - case LOGO_SIZE_48: - data = &logo48; - break; - case LOGO_SIZE_64: - data = &logo64; - break; - case LOGO_SIZE_128: - data = &logo128; - break; - default: - return NULL; - }; - if (pixbufCache[size]) { - g_object_ref (pixbufCache[size]); - return pixbufCache[size]; - } else { - GdkPixbuf *buf = gdk_pixbuf_from_pixdata (data, FALSE, NULL); - pixbufCache[size] = buf; - g_object_add_weak_pointer (G_OBJECT (buf), (void**)(&(pixbufCache[size]))); - return buf; - } -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4 - diff --git a/tikzit/src/gtk/main.m b/tikzit/src/gtk/main.m deleted file mode 100644 index 5d9f4a4..0000000 --- a/tikzit/src/gtk/main.m +++ /dev/null @@ -1,111 +0,0 @@ -// -// main.m -// TikZiT -// -// Copyright 2010 Chris Heunen. All rights reserved. -// -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// - -#import "TZFoundation.h" -#import <gtk/gtk.h> -#import "clipboard.h" -#import "logo.h" -#import "tzstockitems.h" - -#import "Application.h" - -static GOptionEntry entries[] = -{ - //{ "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Be verbose", NULL }, - { NULL } -}; - -void onUncaughtException(NSException* exception) -{ - NSString *joinStr = @"\n "; - NSLog(@"uncaught exception: %@\n backtrace: %@", - [exception description], - [[exception callStackSymbols] componentsJoinedByString:joinStr]); -} - -int main (int argc, char *argv[]) { - NSSetUncaughtExceptionHandler(&onUncaughtException); - - [[NSAutoreleasePool alloc] init]; - - GError *error = NULL; - GOptionContext *context; - context = g_option_context_new ("[FILES] - PGF/TikZ-based graph editor"); - g_option_context_add_main_entries (context, entries, NULL); - g_option_context_add_group (context, gtk_get_option_group (TRUE)); - if (!g_option_context_parse (context, &argc, &argv, &error)) - { - if (error->domain == G_OPTION_ERROR) { - g_print ("%s\nUse --help to see available options\n", error->message); - } else { - g_print ("Unexpected error parsing options: %s\n", error->message); - } - exit (1); - } - g_option_context_free (context); - -#ifndef WINDOWS - GList *icon_list = NULL; - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_128)); - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_64)); - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_48)); - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_32)); - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_24)); - icon_list = g_list_prepend (icon_list, get_logo(LOGO_SIZE_16)); - gtk_window_set_default_icon_list (icon_list); - GList *list_head = icon_list; - while (list_head) { - g_object_unref ((GObject*)list_head->data); - list_head = list_head->next; - } -#endif - - NSAutoreleasePool *initPool = [[NSAutoreleasePool alloc] init]; - - tz_register_stock_items(); - clipboard_init(); - - Application *app = nil; - if (argc > 1) { - NSMutableArray *files = [NSMutableArray arrayWithCapacity:argc-1]; - for (int i = 1; i < argc; ++i) { - [files insertObject:[NSString stringWithGlibFilename:argv[i]] - atIndex:i-1]; - } - NSLog(@"Files: %@", files); - app = [[Application alloc] initWithFiles:files]; - } else { - app = [[Application alloc] init]; - } - - [initPool drain]; - - gtk_main (); - - [app saveConfiguration]; - [app release]; - - return 0; -} - -// vim:ft=objc:et:sts=4:sw=4 diff --git a/tikzit/src/gtk/mkdtemp.h b/tikzit/src/gtk/mkdtemp.h deleted file mode 100644 index 65ee99e..0000000 --- a/tikzit/src/gtk/mkdtemp.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Creating a private temporary directory. - Copyright (C) 2001-2002 Free Software Foundation, Inc. - - 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, 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. */ - -#if HAVE_MKDTEMP - -/* Get mkdtemp() declaration. */ -#include <stdlib.h> - -#else - -/* Create a unique temporary directory from TEMPLATE. - The last six characters of TEMPLATE must be "XXXXXX"; - they are replaced with a string that makes the directory name unique. - Returns TEMPLATE, or a null pointer if it cannot get a unique name. - The directory is created mode 700. */ -extern char * mkdtemp (char *template); - -#endif diff --git a/tikzit/src/gtk/mkdtemp.m b/tikzit/src/gtk/mkdtemp.m deleted file mode 100644 index ee3cd7c..0000000 --- a/tikzit/src/gtk/mkdtemp.m +++ /dev/null @@ -1,180 +0,0 @@ -/* Copyright (C) 1999, 2001-2003 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public License as - published by the Free Software Foundation; either version 2 of the - License, or (at your option) any later version. - - The GNU C Library 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with the GNU C Library; see the file COPYING.LIB. If not, - see <http://www.gnu.org/licenses/>. - */ - -/* Extracted from misc/mkdtemp.c and sysdeps/posix/tempname.c. */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -/* Specification. */ -#include "mkdtemp.h" - -#include <errno.h> -#ifndef __set_errno -# define __set_errno(Val) errno = (Val) -#endif - -#include <stddef.h> -#include <stdlib.h> -#include <string.h> - -#include <stdio.h> -#ifndef TMP_MAX -# define TMP_MAX 238328 -#endif - -#if HAVE_STDINT_H || _LIBC -# include <stdint.h> -#endif -#if HAVE_INTTYPES_H -# include <inttypes.h> -#endif - -#if HAVE_UNISTD_H || _LIBC -# include <unistd.h> -#endif - -#if HAVE_GETTIMEOFDAY || _LIBC -# if HAVE_SYS_TIME_H || _LIBC -# include <sys/time.h> -# endif -#else -# if HAVE_TIME_H || _LIBC -# include <time.h> -# endif -#endif - -#include "stat.h" - -#ifdef __MINGW32__ -/* mingw's mkdir() function has 1 argument, but we pass 2 arguments. - Therefore we have to disable the argument count checking. */ -# define mkdir ((int (*)()) mkdir) -#endif - -#if !_LIBC -# define __getpid getpid -# define __gettimeofday gettimeofday -# define __mkdir mkdir -#endif - -/* Use the widest available unsigned type if uint64_t is not - available. The algorithm below extracts a number less than 62**6 - (approximately 2**35.725) from uint64_t, so ancient hosts where - uintmax_t is only 32 bits lose about 3.725 bits of randomness, - which is better than not having mkstemp at all. */ -#if !defined UINT64_MAX && !defined uint64_t -# define uint64_t uintmax_t -#endif - -/* These are the characters used in temporary filenames. */ -static const char letters[] = -"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - -/* Generate a temporary file name based on TMPL. TMPL must match the - rules for mk[s]temp (i.e. end in "XXXXXX"). The name constructed - does not exist at the time of the call to __gen_tempname. TMPL is - overwritten with the result. - - KIND is: - __GT_DIR: create a directory, which will be mode 0700. - - We use a clever algorithm to get hard-to-predict names. */ -static int -gen_tempname (char *tmpl) -{ - int len; - char *XXXXXX; - static uint64_t value; - uint64_t random_time_bits; - int count, fd = -1; - int save_errno = errno; - - len = strlen (tmpl); - if (len < 6 || strcmp (&tmpl[len - 6], "XXXXXX")) - { - __set_errno (EINVAL); - return -1; - } - - /* This is where the Xs start. */ - XXXXXX = &tmpl[len - 6]; - - /* Get some more or less random data. */ -#ifdef RANDOM_BITS - RANDOM_BITS (random_time_bits); -#else -# if HAVE_GETTIMEOFDAY || _LIBC - { - struct timeval tv; - __gettimeofday (&tv, NULL); - random_time_bits = ((uint64_t) tv.tv_usec << 16) ^ tv.tv_sec; - } -# else - random_time_bits = time (NULL); -# endif -#endif - value += random_time_bits ^ __getpid (); - - for (count = 0; count < TMP_MAX; value += 7777, ++count) - { - uint64_t v = value; - - /* Fill in the random bits. */ - XXXXXX[0] = letters[v % 62]; - v /= 62; - XXXXXX[1] = letters[v % 62]; - v /= 62; - XXXXXX[2] = letters[v % 62]; - v /= 62; - XXXXXX[3] = letters[v % 62]; - v /= 62; - XXXXXX[4] = letters[v % 62]; - v /= 62; - XXXXXX[5] = letters[v % 62]; - - fd = __mkdir (tmpl, S_IRUSR | S_IWUSR | S_IXUSR); - - if (fd >= 0) - { - __set_errno (save_errno); - return fd; - } - else if (errno != EEXIST) - return -1; - } - - /* We got out of the loop because we ran out of combinations to try. */ - __set_errno (EEXIST); - return -1; -} - -/* Generate a unique temporary directory from TEMPLATE. - The last six characters of TEMPLATE must be "XXXXXX"; - they are replaced with a string that makes the filename unique. - The directory is created, mode 700, and its name is returned. - (This function comes from OpenBSD.) */ -char * -mkdtemp (char *template) -{ - if (gen_tempname (template)) - return NULL; - else - return template; -} diff --git a/tikzit/src/gtk/stat.h b/tikzit/src/gtk/stat.h deleted file mode 100644 index a9829ae..0000000 --- a/tikzit/src/gtk/stat.h +++ /dev/null @@ -1,25 +0,0 @@ -#include <sys/stat.h> -#if STAT_MACROS_BROKEN -# undef S_ISDIR -#endif -#if !defined S_ISDIR && defined S_IFDIR -# define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR) -#endif -#if !S_IRUSR && S_IREAD -# define S_IRUSR S_IREAD -#endif -#if !S_IRUSR -# define S_IRUSR 00400 -#endif -#if !S_IWUSR && S_IWRITE -# define S_IWUSR S_IWRITE -#endif -#if !S_IWUSR -# define S_IWUSR 00200 -#endif -#if !S_IXUSR && S_IEXEC -# define S_IXUSR S_IEXEC -#endif -#if !S_IXUSR -# define S_IXUSR 00100 -#endif diff --git a/tikzit/src/gtk/test/gtk.m b/tikzit/src/gtk/test/gtk.m deleted file mode 100644 index aabb0f2..0000000 --- a/tikzit/src/gtk/test/gtk.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// linux.m -// TikZiT -// -// Copyright 2010 Aleks Kissinger. All rights reserved. -// -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// -#import "test/test.h" - -void testGtk() { - -} diff --git a/tikzit/src/gtk/test/main.m b/tikzit/src/gtk/test/main.m deleted file mode 100644 index 639a335..0000000 --- a/tikzit/src/gtk/test/main.m +++ /dev/null @@ -1,50 +0,0 @@ -// -// main.m -// TikZiT -// -// Copyright 2010 Aleks Kissinger. All rights reserved. -// -// -// This file is part of TikZiT. -// -// TikZiT 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 3 of the License, or -// (at your option) any later version. -// -// TikZiT 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 TikZiT. If not, see <http://www.gnu.org/licenses/>. -// -#include "config.h" -#import "test/test.h" -#include <string.h> -void testCommon(); - -int main(int argc, char **argv) { - if (argc == 2 && strcmp(argv[1], "--disable-color")==0) { - setColorEnabled(NO); - } else { - setColorEnabled(YES); - } - - PUTS(@""); - PUTS(@"**********************************************"); - PUTS(@"TikZiT TESTS, LINUX VERSION %@", VERSION); - PUTS(@"**********************************************"); - PUTS(@""); - - startTests(); - testCommon(); - testLinux(); - - PUTS(@""); - PUTS(@"**********************************************"); - endTests(); - PUTS(@"**********************************************"); - PUTS(@""); -} diff --git a/tikzit/src/gtk/tzstockitems.h b/tikzit/src/gtk/tzstockitems.h deleted file mode 100644 index 5ad0da9..0000000 --- a/tikzit/src/gtk/tzstockitems.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#define TIKZIT_STOCK_SELECT "tikzit-select" -#define TIKZIT_STOCK_CREATE_NODE "tikzit-create-node" -#define TIKZIT_STOCK_CREATE_EDGE "tikzit-create-edge" -#define TIKZIT_STOCK_BOUNDING_BOX "tikzit-bounding-box" -#define TIKZIT_STOCK_DRAG "tikzit-drag" - -void tz_register_stock_items(); - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/tzstockitems.m b/tikzit/src/gtk/tzstockitems.m deleted file mode 100644 index 5eba912..0000000 --- a/tikzit/src/gtk/tzstockitems.m +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2012 Alex Merry <dev@randomguy3.me.uk> - * - * 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, see <http://www.gnu.org/licenses/>. - */ - -#include "tzstockitems.h" -#include <gtk/gtk.h> -#include <gdk-pixbuf/gdk-pixdata.h> - -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpointer-sign" -#import "icondata.m" -#pragma GCC diagnostic pop - -static GtkStockItem stock_items[] = { - // gchar *stock_id; - // gchar *label; - // GdkModifierType modifier; - // guint keyval; - // gchar *translation_domain; - { TIKZIT_STOCK_SELECT, "Select", 0, 0, NULL }, - { TIKZIT_STOCK_CREATE_NODE, "Create Node", 0, 0, NULL }, - { TIKZIT_STOCK_CREATE_EDGE, "Create Edge", 0, 0, NULL }, - { TIKZIT_STOCK_BOUNDING_BOX, "Bounding Box", 0, 0, NULL }, - { TIKZIT_STOCK_DRAG, "Drag", 0, 0, NULL }, -}; -static guint n_stock_items = G_N_ELEMENTS (stock_items); - -static void icon_factory_add_pixdata (GtkIconFactory *factory, - const gchar *stock_id, - const GdkPixdata *image_data) { - - GdkPixbuf *buf = gdk_pixbuf_from_pixdata (image_data, FALSE, NULL); - GtkIconSet *icon_set = gtk_icon_set_new_from_pixbuf (buf); - gtk_icon_factory_add (factory, stock_id, icon_set); - gtk_icon_set_unref (icon_set); - g_object_unref (G_OBJECT (buf)); -} - -void tz_register_stock_items() { - gtk_stock_add_static (stock_items, n_stock_items); - - GtkIconFactory *factory = gtk_icon_factory_new (); - icon_factory_add_pixdata (factory, TIKZIT_STOCK_SELECT, &select_rectangular); - icon_factory_add_pixdata (factory, TIKZIT_STOCK_CREATE_NODE, &draw_ellipse); - icon_factory_add_pixdata (factory, TIKZIT_STOCK_CREATE_EDGE, &draw_path); - icon_factory_add_pixdata (factory, TIKZIT_STOCK_BOUNDING_BOX, &transform_crop_and_resize); - icon_factory_add_pixdata (factory, TIKZIT_STOCK_DRAG, &transform_move); - gtk_icon_factory_add_default (factory); -} - -// vim:ft=objc:ts=8:et:sts=4:sw=4:foldmethod=marker diff --git a/tikzit/src/gtk/tztoolpalette.h b/tikzit/src/gtk/tztoolpalette.h deleted file mode 100644 index 45ec2ac..0000000 --- a/tikzit/src/gtk/tztoolpalette.h +++ /dev/null @@ -1,56 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * tztoolpalette.h, based on gimptoolpalette.h - * Copyright (C) 2010 Michael Natterer <mitch@gimp.org> - * - * 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 3 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, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __TZ_TOOL_PALETTE_H__ -#define __TZ_TOOL_PALETTE_H__ - - -#define TZ_TYPE_TOOL_PALETTE (tz_tool_palette_get_type ()) -#define TZ_TOOL_PALETTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TZ_TYPE_TOOL_PALETTE, TzToolPalette)) -#define TZ_TOOL_PALETTE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TZ_TYPE_TOOL_PALETTE, TzToolPaletteClass)) -#define TZ_IS_TOOL_PALETTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TZ_TYPE_TOOL_PALETTE)) -#define TZ_IS_TOOL_PALETTE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TZ_TYPE_TOOL_PALETTE)) -#define TZ_TOOL_PALETTE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TZ_TYPE_TOOL_PALETTE, TzToolPaletteClass)) - - -typedef struct _TzToolPaletteClass TzToolPaletteClass; -typedef struct _TzToolPalette TzToolPalette; - -struct _TzToolPalette -{ - GtkToolPalette parent_instance; -}; - -struct _TzToolPaletteClass -{ - GtkToolPaletteClass parent_class; -}; - - -GType tz_tool_palette_get_type (void) G_GNUC_CONST; - -GtkWidget * tz_tool_palette_new (void); - -gboolean tz_tool_palette_get_button_size (TzToolPalette *widget, - gint *width, - gint *height); - - -#endif /* __TZ_TOOL_PALETTE_H__ */ diff --git a/tikzit/src/gtk/tztoolpalette.m b/tikzit/src/gtk/tztoolpalette.m deleted file mode 100644 index a948127..0000000 --- a/tikzit/src/gtk/tztoolpalette.m +++ /dev/null @@ -1,158 +0,0 @@ -/* GIMP - The GNU Image Manipulation Program - * Copyright (C) 1995 Spencer Kimball and Peter Mattis - * - * tztoolpalette.c, based on gimptoolpalette.c - * Copyright (C) 2010 Michael Natterer <mitch@gimp.org> - * Copyright (C) 2012 Alex Merry <alex.merry@kdemail.net> - * - * 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 3 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, see <http://www.gnu.org/licenses/>. - */ - -#include <gtk/gtk.h> - -#include "tztoolpalette.h" - - -#define DEFAULT_TOOL_ICON_SIZE GTK_ICON_SIZE_BUTTON -#define DEFAULT_BUTTON_RELIEF GTK_RELIEF_NONE - -#define TOOL_BUTTON_DATA_KEY "tz-tool-palette-item" -#define TOOL_INFO_DATA_KEY "tz-tool-info" - - -typedef struct _TzToolPalettePrivate TzToolPalettePrivate; - -struct _TzToolPalettePrivate -{ - gint tool_rows; - gint tool_columns; -}; - -#define GET_PRIVATE(p) G_TYPE_INSTANCE_GET_PRIVATE (p, \ - TZ_TYPE_TOOL_PALETTE, \ - TzToolPalettePrivate) - - -static void tz_tool_palette_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); - - -G_DEFINE_TYPE (TzToolPalette, tz_tool_palette, GTK_TYPE_TOOL_PALETTE) - -#define parent_class tz_tool_palette_parent_class - - -static void -tz_tool_palette_class_init (TzToolPaletteClass *klass) -{ - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); - - widget_class->size_allocate = tz_tool_palette_size_allocate; - - g_type_class_add_private (klass, sizeof (TzToolPalettePrivate)); -} - -static void -tz_tool_palette_init (TzToolPalette *palette) -{ -} - -static GtkToolItemGroup * -tz_tool_palette_tool_group (TzToolPalette *palette) -{ - GList *children; - GtkToolItemGroup *group; - - children = gtk_container_get_children (GTK_CONTAINER (palette)); - g_return_val_if_fail (children, NULL); - group = GTK_TOOL_ITEM_GROUP (children->data); - g_list_free (children); - - return group; -} - -gboolean -tz_tool_palette_get_button_size (TzToolPalette *palette, - gint *width, - gint *height) -{ - g_return_val_if_fail (width || height, FALSE); - - GtkToolItemGroup *group = tz_tool_palette_tool_group (palette); - g_return_val_if_fail (group, FALSE); - - guint tool_count = gtk_tool_item_group_get_n_items (group); - if (tool_count > 0) - { - GtkWidget *tool_button; - GtkRequisition button_requisition; - - tool_button = GTK_WIDGET (gtk_tool_item_group_get_nth_item (group, 0)); - gtk_widget_size_request (tool_button, &button_requisition); - if (width) - *width = button_requisition.width; - if (height) - *height = button_requisition.height; - return TRUE; - } - return FALSE; -} - -static void -tz_tool_palette_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - TzToolPalettePrivate *private = GET_PRIVATE (widget); - GtkToolItemGroup *group = tz_tool_palette_tool_group (TZ_TOOL_PALETTE (widget)); - - g_return_if_fail (group); - - GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation); - - guint tool_count = gtk_tool_item_group_get_n_items (group); - if (tool_count > 0) - { - GtkWidget *tool_button; - GtkRequisition button_requisition; - gint tool_rows; - gint tool_columns; - - tool_button = GTK_WIDGET (gtk_tool_item_group_get_nth_item (group, 0)); - gtk_widget_size_request (tool_button, &button_requisition); - - tool_columns = MAX (1, (allocation->width / button_requisition.width)); - tool_rows = tool_count / tool_columns; - - if (tool_count % tool_columns) - tool_rows++; - - if (private->tool_rows != tool_rows || - private->tool_columns != tool_columns) - { - private->tool_rows = tool_rows; - private->tool_columns = tool_columns; - - gtk_widget_set_size_request (widget, -1, - tool_rows * button_requisition.height); - } - } -} - -GtkWidget * -tz_tool_palette_new (void) -{ - return g_object_new (TZ_TYPE_TOOL_PALETTE, NULL); -} - -// vim:ft=objc:ts=8:et:sts=2:sw=2:foldmethod=marker |