apps-projectcenter/PCMenuController.m
Germán Arias 3da9e8ca27 Changes to allow Windows user make a new project using native Open/Save panels.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/projectcenter/trunk@37722 72102866-910b-0410-8b05-ffd578937521
2014-03-03 04:24:05 +00:00

500 lines
14 KiB
Objective-C

/*
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
{
[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