apps-projectcenter/PCMenuController.m

501 lines
14 KiB
Mathematica
Raw Normal View History

/*
GNUstep ProjectCenter - http://www.gnustep.org/experience/ProjectCenter.html
Copyright (C) 2001 Free Software Foundation
This file is part of GNUstep.
This application 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 application 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 General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
*/
#import <ProjectCenter/PCLogController.h>
#import <ProjectCenter/ProjectCenter.h>
#import <Protocols/CodeEditor.h>
#import "PCAppController.h"
#import "PCMenuController.h"
#import "PCInfoController.h"
#import "PCPrefController.h"
@implementation PCMenuController
- (id)init
{
if ((self = [super init]))
{
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(editorDidBecomeActive:)
name:PCEditorDidBecomeActiveNotification
object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(editorDidResignActive:)
name:PCEditorDidResignActiveNotification
object:nil];
editorIsActive = NO;
}
return self;
}
- (void)dealloc
{
#ifdef DEVELOPMENT
NSLog(@"PCMenuController: dealloc");
#endif
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
- (void)setAppController:(id)anObject
{
appController = anObject;
}
- (void)setProjectManager:(id)anObject
{
projectManager = anObject;
}
//============================================================================
//==== Menu stuff
//============================================================================
// Info
- (void)showPrefWindow:(id)sender
{
[[appController prefController] showPanel:sender];
}
- (void)showInfoPanel:(id)sender
{
[[appController infoController] showInfoWindow:sender];
}
- (void)showEditorPanel:(id)sender
{
[[[projectManager rootActiveProject] projectWindow] showProjectEditor:self];
}
- (void)showLogPanel:(id)sender
{
[[appController logController] showPanel];
}
// Project
- (void)projectOpen:(id)sender
{
[projectManager openProject];
}
- (void)projectNew:(id)sender
{
[projectManager newProject: sender];
}
- (void)projectSave:(id)sender
{
[projectManager saveProject];
}
- (void)projectAddFiles:(id)sender
{
[projectManager addProjectFiles];
}
- (void)projectSaveFiles:(id)sender
{
[projectManager saveProjectFiles];
}
- (void)projectRemoveFiles:(id)sender
{
[projectManager removeProjectFiles];
}
- (void)projectClose:(id)sender
{
[projectManager closeProject];
}
// Subproject
- (void)subprojectNew:(id)sender
{
[projectManager openNewSubprojectPanel];
}
- (void)subprojectAdd:(id)sender
{
[projectManager addSubproject];
}
// File
- (void)fileOpen:(id)sender
{
[projectManager openFile];
}
- (void)fileNew:(id)sender
{
[projectManager newFile];
}
- (void)fileSave:(id)sender
{
[projectManager saveFile];
}
- (void)fileSaveAs:(id)sender
{
* Framework/PCEditorManager.m: Added. * Headers/ProjectCenter/PCEditormanager.h: Added. * PCMenuController.m: (-fileSaveAs:): move code to PCProjectManager.m. * Headers/ProjectCenter/PCEditorManager.h: New file. * Framework/PCEditorManager.m: New file. Superclass for PCProjectEditor. * Framework/PCProjectManager.m: Use PCEditorManager. Implement opening files outside of projects (fixes bug #15992). * Framework/PCProjectLoadedFiles.m: Use PCEditorManager. * Framework/PCProject.m: (-setProjectManager:): Use new method of initializing PCProjectEditor. * Framework/GNUmakefile: Add PCEditorManager.[hm]. * Framework/PCProjectBrowser.m: Made use of PCProjectEditor's editorForFile: method. * Framework/PCProjectEditor.m: Remove initializing of extern variables (moved into PCEditorManager). Use '_componentView' var instead of 'componentView'. The same with _scrollView and _project. (-initWithProject:): renamed into init. Removed code duplicated with superclass' code. (-dealloc): Removed code duplicated with superclass' code. (-editorForFile:key:): Removed. Code moved into superclass' editorForFile: method. (-openEditorForCategoryPath:windowed:): Code that determines existance of file and if file is plain text move into [super openEditorForFile:editable:windowed:]. Changed file opening coditions. Made use of [<CodeEditor> fileStructureItemSelected] method. Code that determines classes and methods in category path was removed. (openEditorForFile:categoryPath:editable:windowed:): Removed in favour of superclass' method. (activeEditor): Ditto. (allEditors): Ditto. (closeActiveEditor:): Ditto. (closeEditorForFile:): Ditto. (saveFile): Ditto. (saveFileTo:): Ditto. (revertFileToSaved): Ditto. (editorDidResignActive:): Ditto. (editorDidChangeFileName:): Ditto. (closeAllEditors:): Cleanup. (saveFileAs:): Made use of new -openEditorForFile:editable:windowed: method. * Framework/PCProjectWindow.m: Made usage of editorManager method of <CodeEditor> protocol. * Modules/Editors/ProjectCenter/PCEditorView.m: (becomeFirstResponder): Use new -becomeFirstResponder: method of PCEditor class. * Modules/Editors/ProjectCenter/PCEditor.h: Change name of var projectEditor to _editorManager. Add parameter (PCEditorView *)view to becomeFistResponder and resignFirstResponder methods. Add some comments. * Modules/Editors/ProjectCenter/PCEditor.m: Rename method -openFileAtPath:categoryPath:projectEditor:editable: to -openFileAtPath:editorManager:editable. Rename -projectEditor method to -editorManager. Change becomeFistResponder and resignFirstResponder methods' definitions. (fileStructureItemSelected:): Add initial implementation of action code according to the type of selected item. * Headers/Protocols/CodeEditor.h: Change definition of -openFileAtPath:categoryPath:projectEditor:editable: mathod to -openFileAtPath:editorManager:editable. Remove methods scrollToClassName: and scrollToMethodName:. Rename projectEditor method into editorManager. * Headers/ProjectCenter/PCProjectEditor.h: Made PCProjectEditor as subclass of PCEditorManager. Add prefix '_' to variables. (-initWithProject:): renamed into init. (setProject:): Added. Removed methods and variables duplicated with superclass. * Headers/ProjectCenter/PCProjectManager.h: Add editorManager var. (-saveFileAs:): renamed to saveFileAs. git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/projectcenter/trunk@25991 72102866-910b-0410-8b05-ffd578937521
2008-01-21 22:26:36 +00:00
[projectManager saveFileAs];
}
- (void)fileSaveTo:(id)sender
{
[projectManager saveFileTo];
}
- (void)fileRevertToSaved:(id)sender
{
[projectManager revertFileToSaved];
}
- (void)fileClose:(id)sender
{
[projectManager closeFile];
}
- (void)fileOpenQuickly:(id)sender
{
NSRunAlertPanel(@"PCMenuController: Sorry!",
@"This feature is not finished yet",
@"OK",nil,nil);
}
- (void)fileRename:(id)sender
{
// Show Inspector panel with "File Attributes" section
[projectManager renameFile];
/* NSRunAlertPanel(@"PCMenuController: Sorry!",
@"This feature is not finished yet",
@"OK",nil,nil);*/
}
- (void)fileNewUntitled:(id)sender
{
NSRunAlertPanel(@"PCMenuController: Sorry!",
@"This feature is not finished yet",
@"OK",nil,nil);
}
// Tools
- (void)toggleToolbar:(id)sender
{
[[[projectManager rootActiveProject] projectWindow] toggleToolbar];
if ([[sender title] isEqualToString:@"Hide Tool Bar"])
{
[sender setTitle:@"Show Tool Bar"];
}
else
{
[sender setTitle:@"Hide Tool Bar"];
}
}
- (void)showInspector:(id)sender
{
[projectManager showProjectInspector:self];
}
// Build Panel
- (void)showBuildPanel:(id)sender
{
[[[projectManager rootActiveProject] projectWindow] showProjectBuild:self];
}
- (void)executeBuild:(id)sender
{
[self showBuildPanel:self];
[[[projectManager rootActiveProject] projectBuilder] performStartBuild];
}
- (void)stopBuild:(id)sender
{
[[[projectManager rootActiveProject] projectBuilder] performStopBuild];
}
- (void)startClean:(id)sender
{
[self showBuildPanel:self];
[[[projectManager rootActiveProject] projectBuilder] performStartClean];
}
// Loaded Files
- (void)showLoadedFilesPanel:(id)sender
{
[projectManager showProjectLoadedFiles:self];
}
- (void)loadedFilesSortByTime:(id)sender
{
[[[projectManager rootActiveProject] projectLoadedFiles] setSortByTime];
}
- (void)loadedFilesSortByName:(id)sender
{
[[[projectManager rootActiveProject] projectLoadedFiles] setSortByName];
}
- (void)loadedFilesNextFile:(id)sender
{
[[[projectManager rootActiveProject] projectLoadedFiles] selectNextFile];
}
- (void)loadedFilesPreviousFile:(id)sender
{
[[[projectManager rootActiveProject] projectLoadedFiles] selectPreviousFile];
}
// Launch Panel
- (void)showLaunchPanel:(id)sender
{
[[[projectManager rootActiveProject] projectWindow] showProjectLaunch:self];
}
- (void)runTarget:(id)sender
{
[self showLaunchPanel:self];
[[[projectManager rootActiveProject] projectLauncher] performRun];
}
- (void)debugTarget:(id)sender
{
[self showLaunchPanel:self];
[[[projectManager rootActiveProject] projectLauncher] performDebug];
}
//============================================================================
//==== Delegate stuff
//============================================================================
- (BOOL)validateMenuItem:(id <NSMenuItem>)menuItem
{
NSString *menuTitle = [[menuItem menu] title];
PCProject *aProject = [projectManager activeProject];
PCProjectEditor *projectEditor = [aProject projectEditor];
PCProjectBrowser *projectBrowser = [aProject projectBrowser];
if ([[projectManager loadedProjects] count] == 0)
{
// Project related menu items
if ([menuTitle isEqualToString: @"Project"])
{
if ([[menuItem title] isEqualToString:@"Save"]) return NO;
if ([[menuItem title] isEqualToString:@"Add Files..."]) return NO;
if ([[menuItem title] isEqualToString:@"Save Files..."]) return NO;
if ([[menuItem title] isEqualToString:@"Remove Files..."]) return NO;
if ([[menuItem title] isEqualToString:@"New Subproject..."])
return NO;
if ([[menuItem title] isEqualToString:@"Add Subproject..."])
return NO;
if ([[menuItem title] isEqualToString:@"Close"]) return NO;
}
// File related menu items
if ([menuTitle isEqualToString: @"File"] && !editorIsActive)
{
if ([[menuItem title] isEqualToString:@"New in Project"]) return NO;
if ([[menuItem title] isEqualToString:@"Save"]) return NO;
if ([[menuItem title] isEqualToString:@"Save As..."]) return NO;
if ([[menuItem title] isEqualToString:@"Save To..."]) return NO;
if ([[menuItem title] isEqualToString:@"Revert to Saved"]) return NO;
if ([[menuItem title] isEqualToString:@"Close"]) return NO;
if ([[menuItem title] isEqualToString:@"Open Quickly..."]) return NO;
if ([[menuItem title] isEqualToString:@"Rename"]) return NO;
if ([[menuItem title] isEqualToString:@"New Untitled"]) return NO;
}
// Tools menu items
if ([menuTitle isEqualToString: @"Tools"])
{
if ([[menuItem title] isEqualToString:@"Inspector..."]) return NO;
if ([[menuItem title] isEqualToString:@"Hide Tool Bar"]) return NO;
if ([[menuItem title] isEqualToString:@"Show Tool Bar"]) return NO;
}
if ([menuTitle isEqualToString: @"Project Build"])
{
if ([[menuItem title] isEqualToString:@"Show Panel..."]) return NO;
if ([[menuItem title] isEqualToString:@"Build"]) return NO;
if ([[menuItem title] isEqualToString:@"Stop Build"]) return NO;
if ([[menuItem title] isEqualToString:@"Clean"]) return NO;
if ([[menuItem title] isEqualToString:@"Next Error"]) return NO;
if ([[menuItem title] isEqualToString:@"Previous Error"]) return NO;
}
if ([menuTitle isEqualToString: @"Project Find"])
{
if ([[menuItem title] isEqualToString:@"Show Panel..."]) return NO;
if ([[menuItem title] isEqualToString:@"Find Preferences"]) return NO;
if ([[menuItem title] isEqualToString:@"Find Definitions"]) return NO;
if ([[menuItem title] isEqualToString:@"Find Text"]) return NO;
if ([[menuItem title] isEqualToString:@"Find Regular Expr"]) return NO;
if ([[menuItem title] isEqualToString:@"Next match"]) return NO;
if ([[menuItem title] isEqualToString:@"Previous match"]) return NO;
}
if ([menuTitle isEqualToString: @"Loaded Files"])
{
if ([[menuItem title] isEqualToString:@"Show Panel..."]) return NO;
if ([[menuItem title] isEqualToString:@"Sort by Time Viewed"]) return NO;
if ([[menuItem title] isEqualToString:@"Sort by Name"]) return NO;
if ([[menuItem title] isEqualToString:@"Next File"]) return NO;
if ([[menuItem title] isEqualToString:@"Previous File"]) return NO;
}
if ([menuTitle isEqualToString: @"Launcher"])
{
if ([[menuItem title] isEqualToString:@"Show Panel..."]) return NO;
if ([[menuItem title] isEqualToString:@"Run"]) return NO;
if ([[menuItem title] isEqualToString:@"Debug"]) return NO;
}
if ([menuTitle isEqualToString: @"Indexer"])
{
if ([[menuItem title] isEqualToString:@"Show Panel..."]) return NO;
if ([[menuItem title] isEqualToString:@"Purge Indices"]) return NO;
if ([[menuItem title] isEqualToString:@"Index Subproject"]) return NO;
if ([[menuItem title] isEqualToString:@"Index File"]) return NO;
}
return YES;
}
// Project related menu items
if ([menuTitle isEqualToString: @"Project"]
&& [projectBrowser nameOfSelectedFile] == nil
&& [projectBrowser selectedFiles] == nil)
{
if ([[menuItem title] isEqualToString:@"Remove Files..."]) return NO;
}
if ([menuTitle isEqualToString: @"Project"]
&& [[projectEditor allEditors] count] == 0)
{
if ([[menuItem title] isEqualToString:@"Save Files..."]) return NO;
}
if ([menuTitle isEqualToString: @"Project"]
&& [projectBrowser nameOfSelectedCategory] == nil)
{
if ([[menuItem title] isEqualToString:@"Add Subproject..."]) return NO;
if ([[menuItem title] isEqualToString:@"Add Files..."]) return NO;
}
if ([menuTitle isEqualToString: @"Project"]
&& [[projectBrowser nameOfSelectedCategory]
isEqualToString:@"Subprojects"])
{
if ([[menuItem title] isEqualToString:@"Add Files..."]) return NO;
}
if ([menuTitle isEqualToString: @"Project"]
&& ![[projectBrowser nameOfSelectedRootCategory] isEqualToString:@"Subprojects"])
{
if ([[menuItem title] isEqualToString:@"Add Subproject..."]) return NO;
}
// File related menu items
if (([menuTitle isEqualToString: @"File"]))
{
if (!editorIsActive)
{
if ([[menuItem title] isEqualToString:@"Save"]) return NO;
if ([[menuItem title] isEqualToString:@"Save As..."]) return NO;
if ([[menuItem title] isEqualToString:@"Save To..."]) return NO;
if ([[menuItem title] isEqualToString:@"Revert to Saved"]) return NO;
if ([[menuItem title] isEqualToString:@"Close"]) return NO;
}
}
if ([projectBrowser nameOfSelectedFile] == nil)
{
if ([[menuItem title] isEqualToString:@"Rename"]) return NO;
}
// Toolbar
if ([[menuItem title] isEqualToString:@"Hide Tool Bar"]
&& ![[[projectManager activeProject] projectWindow] isToolbarVisible])
{
[menuItem setTitle:@"Show Tool Bar"];
}
if ([[menuItem title] isEqualToString:@"Show Tool Bar"]
&& [[[projectManager activeProject] projectWindow] isToolbarVisible])
{
[menuItem setTitle:@"Hide Tool Bar"];
}
// Project Build related
if (([menuTitle isEqualToString: @"Project Build"]))
{
if ([[[projectManager activeProject] projectBuilder] isBuilding]
|| [[[projectManager activeProject] projectBuilder] isCleaning])
{
if ([[menuItem title] isEqualToString:@"Build"]) return NO;
if ([[menuItem title] isEqualToString:@"Clean"]) return NO;
if ([[menuItem title] isEqualToString:@"Next error"]) return NO;
if ([[menuItem title] isEqualToString:@"Previous error"]) return NO;
}
else
{
if ([[menuItem title] isEqualToString:@"Stop Build"]) return NO;
}
}
// Project Launcher related
if (([menuTitle isEqualToString: @"Launcher"]))
{
if ([[[projectManager activeProject] projectLauncher] isRunning]
|| [[[projectManager activeProject] projectLauncher] isDebugging])
{
if ([[menuItem title] isEqualToString:@"Run"]) return NO;
if ([[menuItem title] isEqualToString:@"Debug"]) return NO;
}
}
// Loaded Files related
if (([menuTitle isEqualToString: @"Loaded Files"]))
{
if ([[[aProject projectLoadedFiles] editedFilesRep] count] <= 0)
{
if ([[menuItem title] isEqualToString:@"Sort by Time Viewed"])
return NO;
if ([[menuItem title] isEqualToString:@"Sort by Name"]) return NO;
if ([[menuItem title] isEqualToString:@"Next File"]) return NO;
if ([[menuItem title] isEqualToString:@"Previous File"]) return NO;
}
}
return YES;
}
- (void)editorDidResignActive:(NSNotification *)aNotif
{
editorIsActive = NO;
}
- (void)editorDidBecomeActive:(NSNotification *)aNotif
{
editorIsActive = YES;
}
@end