2
#include "event_notifier.h"
3
#include "svn_overlay_tool.h"
4
#include "diff_dialog.h"
5
#include "file_logger.h"
6
#include "svn_checkout_dialog.h"
7
#include "subversion2_ui.h"
8
#include "wx_tree_traverser.h"
9
#include <wx/settings.h>
10
#include "svn_select_local_repo_dlg.h"
11
#include <wx/filedlg.h>
12
#include <wx/textdlg.h>
14
#include "svn_local_properties.h"
15
#include "svn_props_dialog.h"
16
#include "procutils.h"
17
#include "bitmap_loader.h"
18
#include "svn_login_dialog.h"
19
#include "svn_command_handlers.h"
20
#include "svn_copy_dialog.h"
21
#include "svn_default_command_handler.h"
23
#include <wx/dirdlg.h>
24
#include "fileextmanager.h"
25
#include "svnsettingsdata.h"
26
#include "svnstatushandler.h"
27
#include <wx/wupdlock.h>
28
#include "subversion_strings.h"
29
#include "subversion_view.h"
30
#include <wx/xrc/xmlres.h>
31
#include "svntreedata.h"
32
#include <wx/imaglist.h>
34
#include "workspace.h"
35
#include "subversion2.h"
36
#include "svn_console.h"
38
#include "SvnInfoDialog.h"
40
#include "cl_command_event.h"
41
#include "workspacesvnsettings.h"
42
#include <wx/cmdline.h>
44
#include "clcommandlineparser.h"
45
#include "DiffSideBySidePanel.h"
47
BEGIN_EVENT_TABLE(SubversionView, SubversionPageBase)
48
EVT_UPDATE_UI(XRCID("svn_stop"), SubversionView::OnStopUI)
49
EVT_UPDATE_UI(XRCID("clear_svn_output"), SubversionView::OnClearOuptutUI)
51
EVT_MENU(XRCID("svn_link_editor"), SubversionView::OnLinkEditor)
52
EVT_MENU(XRCID("svn_commit"), SubversionView::OnCommit)
53
EVT_MENU(XRCID("svn_update"), SubversionView::OnUpdate)
54
EVT_MENU(XRCID("svn_revert"), SubversionView::OnRevert)
55
EVT_MENU(XRCID("svn_tag"), SubversionView::OnTag)
56
EVT_MENU(XRCID("svn_branch"), SubversionView::OnBranch)
57
EVT_MENU(XRCID("svn_diff"), SubversionView::OnDiff)
58
EVT_MENU(XRCID("svn_patch"), SubversionView::OnPatch)
59
EVT_MENU(XRCID("svn_patch_dry_run"), SubversionView::OnPatchDryRun)
60
EVT_MENU(XRCID("svn_resolve"), SubversionView::OnResolve)
61
EVT_MENU(XRCID("svn_add"), SubversionView::OnAdd)
62
EVT_MENU(XRCID("svn_delete"), SubversionView::OnDelete)
63
EVT_MENU(XRCID("svn_ignore_file"), SubversionView::OnIgnoreFile)
64
EVT_MENU(XRCID("svn_ignore_file_pattern"), SubversionView::OnIgnoreFilePattern)
65
EVT_MENU(XRCID("svn_blame"), SubversionView::OnBlame)
66
EVT_MENU(XRCID("svn_checkout"), SubversionView::OnCheckout)
67
EVT_MENU(XRCID("svn_open_file"), SubversionView::OnOpenFile)
68
EVT_MENU(XRCID("svn_switch"), SubversionView::OnSwitch)
69
EVT_MENU(XRCID("svn_properties"), SubversionView::OnProperties)
70
EVT_MENU(XRCID("svn_log"), SubversionView::OnLog)
71
EVT_MENU(XRCID("svn_lock"), SubversionView::OnLock)
72
EVT_MENU(XRCID("svn_unlock"), SubversionView::OnUnLock)
73
EVT_MENU(XRCID("svn_rename"), SubversionView::OnRename)
74
EVT_MENU(XRCID("svn_open_local_repo_browser"), SubversionView::OnChangeRootDir)
77
static int FOLDER_IMG_ID = wxNOT_FOUND;
78
static int MODIFIED_IMG_ID = wxNOT_FOUND;
79
static int NEW_IMG_ID = wxNOT_FOUND;
80
static int DELETED_IMG_ID = wxNOT_FOUND;
81
static int CONFLICT_IMG_ID = wxNOT_FOUND;
82
static int UNVERSIONED_IMG_ID = wxNOT_FOUND;
83
static int PROJECT_IMG_ID = wxNOT_FOUND;
84
static int WORKSPACE_IMG_ID = wxNOT_FOUND;
85
static int LOCKED_IMG_ID = wxNOT_FOUND;
87
SubversionView::SubversionView( wxWindow* parent, Subversion2 *plugin )
88
: SubversionPageBase( parent )
90
, m_simpleCommand ( plugin )
91
, m_diffCommand ( plugin )
92
, m_fileExplorerLastBaseImgIdx (-1)
95
m_themeHelper = new ThemeHandlerHelper(this);
96
EventNotifier::Get()->Connect(wxEVT_WORKSPACE_LOADED, wxCommandEventHandler(SubversionView::OnWorkspaceLoaded), NULL, this);
97
EventNotifier::Get()->Connect(wxEVT_WORKSPACE_CLOSED, wxCommandEventHandler(SubversionView::OnWorkspaceClosed), NULL, this);
98
EventNotifier::Get()->Connect(wxEVT_FILE_SAVED, clCommandEventHandler(SubversionView::OnFileSaved), NULL, this);
99
EventNotifier::Get()->Connect(wxEVT_PROJ_FILE_ADDED, clCommandEventHandler(SubversionView::OnFileAdded ), NULL, this);
100
EventNotifier::Get()->Connect(wxEVT_FILE_RENAMED, wxCommandEventHandler(SubversionView::OnFileRenamed), NULL, this);
101
EventNotifier::Get()->Connect(wxEVT_ACTIVE_EDITOR_CHANGED, wxCommandEventHandler(SubversionView::OnActiveEditorChanged), NULL, this);
104
SubversionView::~SubversionView()
106
wxDELETE(m_themeHelper);
110
void SubversionView::OnChangeRootDir( wxCommandEvent& event )
113
wxString newPath = ::wxDirSelector(_("Choose directory"));
114
if ( !newPath.IsEmpty() ) {
115
DoRootDirChanged( newPath );
119
void SubversionView::OnTreeMenu( wxTreeEvent& event )
122
wxArrayTreeItemIds items;
123
size_t count = m_treeCtrl->GetSelections(items);
125
SvnTreeData::SvnNodeType type = DoGetSelectionType(items);
126
if (type == SvnTreeData::SvnNodeTypeInvalid)
127
// Mix or an invalid selection
132
case SvnTreeData::SvnNodeTypeFile:
133
CreateFileMenu( &menu );
136
case SvnTreeData::SvnNodeTypeRoot:
137
CreateRootMenu( &menu );
140
case SvnTreeData::SvnNodeTypeAddedRoot:
141
case SvnTreeData::SvnNodeTypeDeletedRoot:
142
case SvnTreeData::SvnNodeTypeModifiedRoot:
143
case SvnTreeData::SvnNodeTypeFolder:
144
CreateSecondRootMenu( &menu );
155
void SubversionView::CreatGUIControls()
157
MSWSetNativeTheme(m_treeCtrl);
159
// Assign the image list
160
BitmapLoader *bmpLoader = m_plugin->GetManager()->GetStdIcons();
162
// Prepare a default image list which contains all the mimetypes knows to FileExtManager
163
wxImageList *imageList = bmpLoader->MakeStandardMimeImageList();
165
// Append the subversion unique icons
166
FOLDER_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("mime/16/folder" ) ));
167
MODIFIED_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/modified" ) ));
168
NEW_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/new" ) ));
169
DELETED_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/deleted" ) ));
170
CONFLICT_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/conflict" ) ));
171
UNVERSIONED_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/unversioned" ) ));
172
PROJECT_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("workspace/16/project") ) );
173
WORKSPACE_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("workspace/16/workspace") ) );
174
LOCKED_IMG_ID = imageList->Add(bmpLoader->LoadBitmap(wxT("subversion/16/locked" ) ) );
176
m_treeCtrl->AssignImageList( imageList );
179
// Create the toolbar
180
BitmapLoader *bmpLdr = m_plugin->GetManager()->GetStdIcons();
181
wxToolBar *tb = new wxToolBar(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_FLAT|wxTB_HORIZONTAL|wxTB_NODIVIDER);
182
tb->AddTool(XRCID("svn_link_editor"), _("Link Editor"), wxXmlResource::Get()->LoadBitmap(wxT("link_editor")), _("Link Editor"), wxITEM_CHECK);
183
tb->ToggleTool(XRCID("svn_link_editor"), m_plugin->GetSettings().GetFlags() & SvnLinkEditor);
184
tb->AddTool(XRCID("svn_open_local_repo_browser"), _("Select a Directory to View..."), bmpLdr->LoadBitmap(wxT("toolbars/16/standard/file_open")), _("Select a Directory to View..."), wxITEM_NORMAL);
187
tb->AddTool(XRCID("svn_stop"), _("Stop current svn process"), bmpLdr->LoadBitmap(wxT("subversion/16/stop")), _( "Stop current svn process" ) );
188
tb->AddTool(XRCID("svn_cleanup"), _("Svn Cleanup"), bmpLdr->LoadBitmap(wxT("subversion/16/cleanup")), _( "Svn Cleanup" ) );
190
tb->AddTool(XRCID("svn_checkout"), _("Svn Checkout"), bmpLdr->LoadBitmap(wxT("subversion/16/checkout")), _( "Svn Checkout" ) );
192
tb->AddTool(XRCID("svn_refresh"), _("Refresh View"), bmpLdr->LoadBitmap(wxT("subversion/16/refresh")), _( "Refresh View" ) );
194
tb->AddTool(XRCID("clear_svn_output"), _("Clear Svn Output Tab"), bmpLdr->LoadBitmap(wxT("output-pane/16/clear")), _("Clear Svn Output Tab"), wxITEM_NORMAL);
195
tb->AddTool(XRCID("svn_settings"), _("Svn Settings..."), bmpLdr->LoadBitmap(wxT("subversion/16/settings")), _( "Svn Settings..." ) );
196
tb->AddTool(XRCID("svn_info"), _("Svn Info"), bmpLdr->LoadBitmap(wxT("subversion/16/info")), _( "Svn Info" ) );
198
tb->Connect(XRCID("clear_svn_output"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnClearOuptut), NULL, this);
199
tb->Connect(XRCID("svn_stop"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnStop), NULL, this);
200
tb->Connect(XRCID("svn_cleanup"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnCleanup), NULL, this);
201
tb->Connect(XRCID("svn_info"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnShowSvnInfo), NULL, this);
202
tb->Connect(XRCID("svn_refresh"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnRefreshView), NULL, this);
203
tb->Connect(XRCID("svn_settings"), wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(SubversionView::OnSettings), NULL, this);
205
wxSizer *sz = GetSizer();
206
sz->Insert(0, tb, 0, wxEXPAND);
209
m_subversionConsole = new SvnConsole(m_plugin->GetManager()->GetOutputPaneNotebook(), m_plugin);
210
m_plugin->GetManager()->GetOutputPaneNotebook()->AddPage(m_subversionConsole, wxT("Subversion"), false, m_plugin->GetManager()->GetStdIcons()->LoadBitmap(wxT("subversion/16/svn")));
212
DoRootDirChanged(wxGetCwd());
216
void SubversionView::BuildTree()
218
BuildTree( DoGetCurRepoPath() );
221
void SubversionView::BuildTree(const wxString& root)
226
DoChangeRootPathUI(root);
229
command << m_plugin->GetSvnExeName() << wxT(" --no-ignore status");
230
m_simpleCommand.Execute(command, root, new SvnStatusHandler(m_plugin, wxNOT_FOUND, NULL), m_plugin);
233
void SubversionView::BuildExplorerTree(const wxString& root)
239
command << m_plugin->GetSvnExeName() << wxT(" --no-ignore status");
240
m_simpleCommand.Execute(command, root, new SvnStatusHandler(m_plugin, wxNOT_FOUND, NULL, true, root), m_plugin);
244
void SubversionView::OnWorkspaceLoaded(wxCommandEvent& event)
248
// Workspace changes its directory to the workspace path, update the SVN path
249
wxString path = ::wxGetCwd();
250
m_workspaceFile = event.GetString();
252
WorkspaceSvnSettings conf(m_workspaceFile);
253
wxString customizedRepo = conf.Load().GetRepoPath();
254
if ( !customizedRepo.IsEmpty() ) {
255
path.swap( customizedRepo );
258
DoRootDirChanged(path);
262
void SubversionView::OnWorkspaceClosed(wxCommandEvent& event)
266
// Save the local svn settings
267
if ( m_workspaceFile.IsOk() && m_workspaceFile.Exists() ) {
268
WorkspaceSvnSettings conf(m_workspaceFile);
269
conf.SetRepoPath( m_curpath );
273
m_workspaceFile.Clear();
274
DoChangeRootPathUI(_("<No repository path is selected>"));
275
m_plugin->GetConsole()->Clear();
278
void SubversionView::ClearAll()
280
m_treeCtrl->DeleteAllItems();
283
void SubversionView::UpdateTree(const wxArrayString& modifiedFiles, const wxArrayString& conflictedFiles, const wxArrayString& unversionedFiles, const wxArrayString& newFiles, const wxArrayString& deletedFiles, const wxArrayString& lockedFiles, const wxArrayString& ignoreFiles, bool fileExplorerOnly, const wxString& sRootDir)
285
wxString rootDir = sRootDir;
286
if(rootDir.IsEmpty())
287
rootDir = DoGetCurRepoPath();
289
if( !fileExplorerOnly ) {
292
wxWindowUpdateLocker locker(m_treeCtrl);
294
clWindowUpdateLocker locker( m_treeCtrl );
299
wxTreeItemId root = m_treeCtrl->AddRoot(rootDir, FOLDER_IMG_ID, FOLDER_IMG_ID, new SvnTreeData(SvnTreeData::SvnNodeTypeRoot, rootDir));
301
if(root.IsOk() == false)
304
DoAddNode(svnMODIFIED_FILES, MODIFIED_IMG_ID, SvnTreeData::SvnNodeTypeModifiedRoot, modifiedFiles);
305
DoAddNode(svnADDED_FILES, NEW_IMG_ID, SvnTreeData::SvnNodeTypeAddedRoot, newFiles);
306
DoAddNode(svnDELETED_FILES, DELETED_IMG_ID, SvnTreeData::SvnNodeTypeDeletedRoot, deletedFiles);
307
DoAddNode(svnCONFLICTED_FILES, CONFLICT_IMG_ID, SvnTreeData::SvnNodeTypeConflictRoot, conflictedFiles);
308
DoAddNode(svnLOCKED_FILES, LOCKED_IMG_ID, SvnTreeData::SvnNodeTypeLockedRoot, lockedFiles);
309
DoAddNode(svnUNVERSIONED_FILES, UNVERSIONED_IMG_ID, SvnTreeData::SvnNodeTypeUnversionedRoot, unversionedFiles);
311
if (m_treeCtrl->ItemHasChildren(root)) {
312
m_treeCtrl->Expand(root);
322
DoCreateFileExplorerImages();
325
if(m_fileExplorerLastBaseImgIdx != -1) {
326
// Unified all the arrays into a single map
327
SvnFileExplorerTraverser::Map_t mymap;
329
wxTreeCtrl* fileExplorer = m_plugin->GetManager()->GetTree(TreeFileExplorer);
330
wxTreeItemId feRootItem = fileExplorer->GetItemByFullPath(rootDir);
333
wxWindowUpdateLocker locker(fileExplorer);
335
clWindowUpdateLocker locker(fileExplorer);
337
DoAddArrayToMap(modifiedFiles, mymap, SvnFileExplorerTraverser::Modified, rootDir);
338
DoAddArrayToMap(newFiles, mymap, SvnFileExplorerTraverser::New, rootDir);
339
DoAddArrayToMap(deletedFiles, mymap, SvnFileExplorerTraverser::Deleted, rootDir);
340
DoAddArrayToMap(conflictedFiles, mymap, SvnFileExplorerTraverser::Conflicted, rootDir);
341
DoAddArrayToMap(lockedFiles, mymap, SvnFileExplorerTraverser::Locked, rootDir);
342
DoAddArrayToMap(unversionedFiles, mymap, SvnFileExplorerTraverser::Unversioned, rootDir);
343
DoAddArrayToMap(ignoreFiles, mymap, SvnFileExplorerTraverser::Ignored, rootDir);
345
if (feRootItem.IsOk()) {
346
CL_DEBUG(wxT("wxTreeTraverser started..."));
347
SvnFileExplorerTraverser traverser(fileExplorer, mymap, m_fileExplorerLastBaseImgIdx, DoGetCurRepoPath());
348
traverser.Traverse(feRootItem);
349
CL_DEBUG(wxT("wxTreeTraverser started...end"));
356
void SubversionView::DoAddNode(const wxString& title, int imgId, SvnTreeData::SvnNodeType nodeType, const wxArrayString& files)
358
wxTreeItemId root = m_treeCtrl->GetRootItem();
359
wxString basePath = DoGetCurRepoPath();
361
// Add the basic four root items
362
if (files.IsEmpty() == false) {
364
wxTreeItemId parent = m_treeCtrl->AppendItem(root, title, imgId, imgId, new SvnTreeData(nodeType, wxT("")));
366
// Set the parent node with bold font
367
wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
368
font.SetWeight(wxFONTWEIGHT_BOLD);
369
m_treeCtrl->SetItemFont(parent, font);
371
// Add all children items
372
for (size_t i=0; i<files.GetCount(); i++) {
373
wxFileName filename(files.Item(i));
374
wxTreeItemId folderParent = DoGetParentNode(files.Item(i), parent);
375
m_treeCtrl->AppendItem(folderParent,
376
filename.GetFullName(),
377
DoGetIconIndex(filename.GetFullName()),
378
DoGetIconIndex(filename.GetFullName()),
379
new SvnTreeData(SvnTreeData::SvnNodeTypeFile, files.Item(i)));
382
if ( nodeType != SvnTreeData::SvnNodeTypeUnversionedRoot) {
383
m_treeCtrl->Expand(parent);
385
// Expand the top level children as well
386
wxTreeItemIdValue cookie;
387
wxTreeItemId child = m_treeCtrl->GetFirstChild(parent, cookie);
388
while( child.IsOk() ) {
389
if(m_treeCtrl->ItemHasChildren(child)) {
390
m_treeCtrl->Expand(child);
392
child = m_treeCtrl->GetNextChild(parent, cookie);
399
int SubversionView::DoGetIconIndex(const wxString& filename)
401
FileExtManager::Init();
402
int iconIndex = m_plugin->GetManager()->GetStdIcons()->GetMimeImageId(filename);
403
if(iconIndex == wxNOT_FOUND)
404
iconIndex = m_plugin->GetManager()->GetStdIcons()->GetMimeImageId(wxT("file.txt")); // text file icon is the default
409
SvnTreeData::SvnNodeType SubversionView::DoGetSelectionType(const wxArrayTreeItemIds& items)
411
m_selectionInfo.Clear();
412
SvnTreeData::SvnNodeType type(SvnTreeData::SvnNodeTypeInvalid);
413
for (size_t i=0; i<items.GetCount(); i++) {
414
if (items.Item(i).IsOk() == false) {
415
m_selectionInfo.Clear();
416
return m_selectionInfo.m_selectionType; // Invalid
419
SvnTreeData *data = (SvnTreeData *)m_treeCtrl->GetItemData(items.Item(i));
421
m_selectionInfo.Clear();
422
return m_selectionInfo.m_selectionType; // Invalid
425
if (data->GetType() == SvnTreeData::SvnNodeTypeRoot && items.GetCount() == 1) {
426
// populate the list of paths with all the added paths
427
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
428
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeRoot;
429
return m_selectionInfo.m_selectionType;
432
if (data->GetType() == SvnTreeData::SvnNodeTypeAddedRoot && items.GetCount() == 1) {
433
// populate the list of paths with all the added paths
434
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
435
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeAddedRoot;
436
return m_selectionInfo.m_selectionType;
439
if (data->GetType() == SvnTreeData::SvnNodeTypeDeletedRoot && items.GetCount() == 1) {
440
// populate the list of paths with all the deleted paths
441
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
442
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeDeletedRoot;
443
return m_selectionInfo.m_selectionType;
446
if (data->GetType() == SvnTreeData::SvnNodeTypeConflictRoot && items.GetCount() == 1) {
447
// populate the list of paths with all the conflicted paths
448
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
449
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeConflictRoot;
450
return m_selectionInfo.m_selectionType;
453
if (data->GetType() == SvnTreeData::SvnNodeTypeModifiedRoot && items.GetCount() == 1) {
454
// populate the list of paths with all the conflicted paths
455
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
456
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeModifiedRoot;
457
return m_selectionInfo.m_selectionType;
460
if (data->GetType() == SvnTreeData::SvnNodeTypeFolder && items.GetCount() == 1) {
461
// populate the list of paths with all the conflicted paths
462
DoGetPaths( items.Item(i), m_selectionInfo.m_paths );
463
m_selectionInfo.m_selectionType = SvnTreeData::SvnNodeTypeFolder;
464
return m_selectionInfo.m_selectionType;
467
if (type == SvnTreeData::SvnNodeTypeInvalid &&
468
(data->GetType() == SvnTreeData::SvnNodeTypeFile || data->GetType() == SvnTreeData::SvnNodeTypeRoot)) {
469
type = data->GetType();
470
m_selectionInfo.m_selectionType = type;
471
m_selectionInfo.m_paths.Add(data->GetFilepath());
473
} else if ( type == SvnTreeData::SvnNodeTypeInvalid ) {
474
type = data->GetType();
476
} else if (data->GetType() != type) {
477
m_selectionInfo.m_paths.Clear();
478
return SvnTreeData::SvnNodeTypeInvalid;
481
// Same type, just add the path
482
m_selectionInfo.m_paths.Add(data->GetFilepath());
488
void SubversionView::CreateSecondRootMenu(wxMenu* menu)
490
menu->Append(XRCID("svn_commit"), wxT("Commit"));
491
menu->Append(XRCID("svn_update"), wxT("Update"));
492
menu->AppendSeparator();
493
menu->Append(XRCID("svn_revert"), wxT("Revert"));
494
menu->Append(XRCID("svn_add"), wxT("Add"));
495
menu->AppendSeparator();
496
menu->Append(XRCID("svn_diff"), _("Create Diff..."));
499
void SubversionView::CreateFileMenu(wxMenu* menu)
501
menu->Append(XRCID("svn_open_file"), _("Open File..."));
502
menu->AppendSeparator();
503
menu->Append(XRCID("svn_commit"), wxT("Commit"));
504
menu->Append(XRCID("svn_update"), wxT("Update"));
505
menu->AppendSeparator();
506
menu->Append(XRCID("svn_revert"), wxT("Revert"));
508
menu->AppendSeparator();
509
menu->Append(XRCID("svn_lock"), wxT("Lock"));
510
menu->Append(XRCID("svn_unlock"), wxT("Unlock"));
512
menu->AppendSeparator();
513
menu->Append(XRCID("svn_add"), wxT("Add"));
514
menu->Append(XRCID("svn_delete"), wxT("Delete"));
515
menu->Append(XRCID("svn_rename"), wxT("Rename"));
516
menu->AppendSeparator();
517
menu->Append(XRCID("svn_resolve"), wxT("Resolve"));
518
menu->AppendSeparator();
519
menu->Append(XRCID("svn_diff"), _("Create Diff..."));
520
menu->AppendSeparator();
522
menu->Append(XRCID("svn_blame"), _("Blame..."));
523
menu->AppendSeparator();
526
subMenu = new wxMenu;
527
subMenu->Append(XRCID("svn_ignore_file"), _("Ignore this file"));
528
subMenu->Append(XRCID("svn_ignore_file_pattern"), _("Ignore this file pattern"));
529
menu->Append(wxID_ANY, wxT("Ignore"), subMenu);
532
void SubversionView::CreateRootMenu(wxMenu* menu)
534
menu->Append(XRCID("svn_commit"), wxT("Commit"));
535
menu->Append(XRCID("svn_update"), wxT("Update"));
536
menu->AppendSeparator();
538
menu->Append(XRCID("svn_revert"), wxT("Revert"));
539
menu->AppendSeparator();
541
menu->Append(XRCID("svn_tag"), _("Create Tag"));
542
menu->Append(XRCID("svn_branch"), _("Create Branch"));
543
menu->AppendSeparator();
545
menu->Append(XRCID("svn_switch"), _("Switch URL..."));
546
menu->AppendSeparator();
548
menu->Append(XRCID("svn_diff"), _("Create Diff..."));
549
menu->Append(XRCID("svn_patch"), _("Apply Patch..."));
550
menu->Append(XRCID("svn_patch_dry_run"), _("Apply Patch - Dry Run..."));
552
menu->AppendSeparator();
553
menu->Append(XRCID("svn_log"), _("Change Log..."));
555
menu->AppendSeparator();
556
menu->Append(XRCID("svn_properties"), _("Properties..."));
559
void SubversionView::DoGetPaths(const wxTreeItemId& parent, wxArrayString& paths)
561
if ( m_treeCtrl->ItemHasChildren(parent) == false ) {
565
wxTreeItemIdValue cookie;
566
wxTreeItemId item = m_treeCtrl->GetFirstChild(parent, cookie);
567
while ( item.IsOk() ) {
568
SvnTreeData *data = (SvnTreeData *)m_treeCtrl->GetItemData(item);
571
if (data->GetFilepath().IsEmpty() == false && data->GetType() == SvnTreeData::SvnNodeTypeFile) {
572
paths.Add( data->GetFilepath() );
575
if (( data->GetType() == SvnTreeData::SvnNodeTypeAddedRoot ||
576
data->GetType() == SvnTreeData::SvnNodeTypeModifiedRoot ||
577
data->GetType() == SvnTreeData::SvnNodeTypeDeletedRoot ||
578
data->GetType() == SvnTreeData::SvnNodeTypeFolder) &&
579
m_treeCtrl->ItemHasChildren(item)) {
580
DoGetPaths(item, paths);
583
item = m_treeCtrl->GetNextChild(parent, cookie);
587
////////////////////////////////////////////
588
// Source control command handlers
589
////////////////////////////////////////////
591
void SubversionView::OnUpdate(wxCommandEvent& event)
594
wxString loginString;
595
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
598
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
599
command << m_plugin->GetSvnExeName(nonInteractive) << loginString << wxT(" update ");
601
if (m_selectionInfo.m_selectionType != SvnTreeData::SvnNodeTypeRoot) {
602
// Concatenate list of files to be updated
603
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
604
command << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
608
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnUpdateHandler(m_plugin, event.GetId(), this));
611
void SubversionView::OnCommit(wxCommandEvent& event)
613
m_plugin->DoCommit(m_selectionInfo.m_paths, DoGetCurRepoPath(), event);
616
void SubversionView::OnAdd(wxCommandEvent& event)
619
wxString loginString;
620
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
624
command << m_plugin->GetSvnExeName(false) << loginString << wxT(" add ");
626
// Concatenate list of files to be updated
627
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
628
command << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
631
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
634
void SubversionView::OnRevert(wxCommandEvent& event)
638
// Svn revert does not require login string
639
command << m_plugin->GetSvnExeName(false) << wxT(" revert --recursive ");
641
if (m_selectionInfo.m_selectionType != SvnTreeData::SvnNodeTypeRoot) {
642
// Concatenate list of files to be updated
643
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
644
command << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
649
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
652
void SubversionView::OnBranch(wxCommandEvent& event)
655
command << m_plugin->GetSvnExeName() << wxT("info --xml ");
658
m_plugin->DoGetSvnInfoSync(svnInfo, DoGetCurRepoPath());
661
wxString loginString;
662
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
666
// Prompt user for URLs + comment
667
SvnCopyDialog dlg(m_plugin->GetManager()->GetTheApp()->GetTopWindow());
669
dlg.SetTitle(_("Create Branch"));
670
dlg.SetSourceURL(svnInfo.m_sourceUrl);
671
dlg.SetTargetURL(svnInfo.m_sourceUrl);
673
if (dlg.ShowModal() == wxID_OK) {
675
// Prepare the 'copy' command
676
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
678
<< m_plugin->GetSvnExeName(nonInteractive)
681
<< dlg.GetSourceURL()
683
<< dlg.GetTargetURL()
688
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
692
void SubversionView::OnTag(wxCommandEvent& event)
695
command << m_plugin->GetSvnExeName() << wxT("info --xml ");
698
m_plugin->DoGetSvnInfoSync(svnInfo, DoGetCurRepoPath());
700
// Prompt the login dialog now
702
wxString loginString;
703
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
707
// Prompt user for URLs + comment
708
SvnCopyDialog dlg(m_plugin->GetManager()->GetTheApp()->GetTopWindow());
710
dlg.SetTitle(_("Create Tag"));
711
dlg.SetSourceURL(svnInfo.m_sourceUrl);
712
dlg.SetTargetURL(svnInfo.m_sourceUrl);
714
if (dlg.ShowModal() == wxID_OK) {
715
// Prepare the 'copy' command
716
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
719
<< m_plugin->GetSvnExeName(nonInteractive)
722
<< dlg.GetSourceURL()
724
<< dlg.GetTargetURL()
729
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
733
void SubversionView::OnDelete(wxCommandEvent& event)
736
wxString loginString;
737
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
740
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
741
command << m_plugin->GetSvnExeName(nonInteractive) << loginString << wxT(" --force delete ");
743
// Concatenate list of files to be updated
744
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
745
command << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
748
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
751
void SubversionView::OnResolve(wxCommandEvent& event)
754
wxString loginString;
755
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
759
command << m_plugin->GetSvnExeName(false) << loginString << wxT(" resolved ");
761
// Concatenate list of files to be updated
762
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
763
command << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
766
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
769
void SubversionView::OnDiff(wxCommandEvent& event)
771
wxString loginString;
772
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
776
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
778
DiffDialog dlg(this, m_plugin->GetManager());
779
if(dlg.ShowModal() == wxID_OK) {
780
wxString from = dlg.GetFromRevision();
781
wxString to = dlg.GetToRevision();
783
if(to.IsEmpty() == false) {
784
to.Prepend(wxT(":"));
789
diff_cmd << m_plugin->GetSvnExeNameNoConfigDir(nonInteractive) << loginString;
791
SvnSettingsData ssd = m_plugin->GetSettings();
792
if ( ssd.GetFlags() & SvnUseExternalDiff ) {
793
diff_cmd << " --diff-cmd=\"" << ssd.GetExternalDiffViewer() << "\" ";
795
diff_cmd << " diff ";
797
if ( dlg.IgnoreWhitespaces() && !(ssd.GetFlags() & SvnUseExternalDiff) ) {
798
diff_cmd << " -x -w ";
801
diff_cmd << " -r " << from << to << " ";
803
for (size_t i=0; i<m_selectionInfo.m_paths.GetCount(); i++) {
804
diff_cmd << wxT("\"") << m_selectionInfo.m_paths.Item(i) << wxT("\" ");
806
m_plugin->GetConsole()->Execute(diff_cmd, DoGetCurRepoPath(), new SvnDiffHandler(m_plugin, event.GetId(), this), false);
810
void SubversionView::OnPatch(wxCommandEvent& event)
812
m_plugin->Patch(false, DoGetCurRepoPath(), this, event.GetId());
815
void SubversionView::OnPatchDryRun(wxCommandEvent& event)
817
m_plugin->Patch(true, DoGetCurRepoPath(), this, event.GetId());
820
void SubversionView::OnCleanup(wxCommandEvent& event)
824
command << m_plugin->GetSvnExeName(false) << wxT(" cleanup ");
825
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, wxNOT_FOUND, NULL));
828
void SubversionView::OnStop(wxCommandEvent& event)
831
m_plugin->GetConsole()->Stop();
834
void SubversionView::OnClearOuptut(wxCommandEvent& event)
837
m_plugin->GetConsole()->Clear();
840
void SubversionView::OnRefreshView(wxCommandEvent& event)
846
void SubversionView::OnFileAdded(clCommandEvent& event)
850
typedef std::map<wxString, bool> StringBoolMap_t;
851
StringBoolMap_t path_in_svn;
854
int flags = event.GetInt();
855
if ( flags & kEventImportingFolder )
858
SvnSettingsData ssd = m_plugin->GetSettings();
859
if(ssd.GetFlags() & SvnAddFileToSvn) {
860
const wxArrayString &files = event.GetStrings();
861
bool addToSvn(false);
863
command << m_plugin->GetSvnExeName() << wxT(" add ");
864
for(size_t i=0; i<files.GetCount(); i++) {
866
wxString currentFilePath = files.Item(i).BeforeLast(wxFILE_SEP_PATH);
867
bool curPathUnderSvn = false;
868
if ( path_in_svn.count( currentFilePath ) ) {
869
// use the cached result
870
curPathUnderSvn = path_in_svn.find(currentFilePath)->second;
873
// query svn and cache the result for future use
874
curPathUnderSvn = m_plugin->IsPathUnderSvn( currentFilePath );
875
path_in_svn.insert( std::make_pair(currentFilePath, curPathUnderSvn ) );
878
if (curPathUnderSvn) {
879
command << wxT("\"") << files.Item(i) << wxT("\" ");
885
command.RemoveLast();
886
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
892
void SubversionView::OnFileRenamed(wxCommandEvent& event)
894
wxArrayString *files = (wxArrayString*)event.GetClientData();
896
// If the Svn Client Version is set to 0.0 it means that we dont have SVN client installed
897
if( m_plugin->GetSvnClientVersion() && files && (m_plugin->GetSettings().GetFlags() & SvnRenameFileInRepo) ) {
898
wxString oldName = files->Item(0);
899
wxString newName = files->Item(1);
901
if(m_plugin->IsPathUnderSvn( wxFileName(oldName).GetPath() ) == false) {
907
command << m_plugin->GetSvnExeName() << wxT(" rename \"") << oldName << wxT("\" \"") << newName << wxT("\"");
908
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDefaultCommandHandler(m_plugin, event.GetId(), this));
914
void SubversionView::OnShowSvnInfo(wxCommandEvent& event)
919
m_plugin->DoGetSvnInfoSync(svnInfo, DoGetCurRepoPath());
921
SvnInfoDialog dlg(m_plugin->GetManager()->GetTheApp()->GetTopWindow());
922
dlg.GetTextCtrlAuthor()->SetValue( svnInfo.m_author );
923
dlg.GetTextCtrlDate()->SetValue( svnInfo.m_date );
924
dlg.GetTextCtrlRevision()->SetValue( svnInfo.m_revision );
925
dlg.GetTextCtrlRootURL()->SetValue( svnInfo.m_url );
926
dlg.GetTextCtrlURL()->SetValue( svnInfo.m_sourceUrl );
930
void SubversionView::OnItemActivated(wxTreeEvent& event)
932
wxTreeItemId item = m_treeCtrl->GetFocusedItem();
933
CHECK_ITEM_RET(item);
935
SvnTreeData *data = (SvnTreeData *)m_treeCtrl->GetItemData(item);
936
if (!data || data->GetType() != SvnTreeData::SvnNodeTypeFile) {
941
wxString loginString;
942
if(m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString) == false) {
946
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
951
// By default use ignore-whitespaces
952
command << m_plugin->GetSvnExeNameNoConfigDir(nonInteractive) << loginString;
954
SvnSettingsData ssd = m_plugin->GetSettings();
955
if ( ssd.GetFlags() & SvnUseExternalDiff ) {
957
// Using external diff viewer
958
command << " diff \"" << data->GetFilepath() << "\" --diff-cmd=\"" << ssd.GetExternalDiffViewer() << "\"";
959
m_plugin->GetConsole()->Execute(command, DoGetCurRepoPath(), new SvnDiffHandler(m_plugin, event.GetId(), this), false);
963
// Use the internal diff viewer
964
// --diff-cmd will execute external tool like this:
965
// -u -L "php-plugin/XDebugManager.cpp (revision 447)" -L "php-plugin/XDebugManager.cpp (working copy)" C:\src\codelite\codelitephp\.svn\pristine\ae\ae25b80b53f432c6124c455ef815679df6ed4ea4.svn-base C:\src\codelite\codelitephp\php-plugin\XDebugManager.cpp
966
command << " diff \"" << data->GetFilepath() << "\" --diff-cmd=";
967
// We dont have proper echo on windows that can be used here, so
968
// we provide our own batch script wrapper
969
wxFileName echoTool(wxStandardPaths::Get().GetExecutablePath());
970
echoTool.SetFullName("codelite-echo");
972
echoTool.SetExt("exe");
974
command << "\"" << echoTool.GetFullPath() << "\"";
979
::wxSetWorkingDirectory( DoGetCurRepoPath() );
980
ProcUtils::SafeExecuteCommand(command, lines);
982
if ( lines.GetCount() < 3 ) {
986
clCommandLineParser parser(lines.Item(2));
987
wxArrayString tokens = parser.ToArray();
988
if ( tokens.GetCount() < 2 )
991
wxString rightFile = tokens.Last();
992
tokens.RemoveAt(tokens.GetCount()-1);
993
wxString leftFile = tokens.Last();
995
// get the left file title
996
wxString title_left, title_right;
997
title_right = _("Working copy");
998
title_left = _("HEAD version");
1000
DiffSideBySidePanel *diffPanel = new DiffSideBySidePanel( EventNotifier::Get()->TopFrame());
1001
DiffSideBySidePanel::FileInfo l(leftFile, title_left, true);
1002
DiffSideBySidePanel::FileInfo r(rightFile, title_right, false);
1003
diffPanel->SetFilesDetails(l, r);
1005
diffPanel->SetOriginSourceControl();
1006
m_plugin->GetManager()->AddPage( diffPanel, _("Svn Diff: ") + wxFileName(data->GetFilepath()).GetFullName(), wxNullBitmap, true);
1010
void SubversionView::OnStopUI(wxUpdateUIEvent& event)
1012
event.Enable(m_plugin->GetConsole()->IsRunning());
1015
void SubversionView::OnClearOuptutUI(wxUpdateUIEvent& event)
1017
event.Enable(m_plugin->GetConsole()->IsEmpty() == false);
1020
void SubversionView::OnCheckout(wxCommandEvent& event)
1022
wxString loginString;
1023
if(!m_plugin->LoginIfNeeded(event, DoGetCurRepoPath(), loginString))
1027
bool nonInteractive = m_plugin->GetNonInteractiveMode(event);
1029
SvnCheckoutDialog dlg(m_plugin->GetManager()->GetTheApp()->GetTopWindow(), m_plugin);
1030
if(dlg.ShowModal() == wxID_OK) {
1031
command << m_plugin->GetSvnExeName(nonInteractive) << loginString << wxT(" co ") << dlg.GetURL() << wxT(" \"") << dlg.GetTargetDir() << wxT("\"");
1032
m_plugin->GetConsole()->ExecuteURL(command, dlg.GetURL(), new SvnCheckoutHandler(m_plugin, event.GetId(), this), true);
1036
void SubversionView::OnIgnoreFile(wxCommandEvent& event)
1039
m_plugin->IgnoreFiles(m_selectionInfo.m_paths, false);
1042
void SubversionView::OnIgnoreFilePattern(wxCommandEvent& event)
1045
m_plugin->IgnoreFiles(m_selectionInfo.m_paths, true);
1048
void SubversionView::OnSettings(wxCommandEvent& event)
1051
m_plugin->EditSettings();
1054
void SubversionView::OnBlame(wxCommandEvent& event)
1056
m_plugin->Blame(event, m_selectionInfo.m_paths);
1059
void SubversionView::OnLinkEditor(wxCommandEvent& event)
1061
SvnSettingsData ssd = m_plugin->GetSettings();
1062
if(event.IsChecked())
1063
ssd.SetFlags(ssd.GetFlags() | SvnLinkEditor);
1065
ssd.SetFlags(ssd.GetFlags() & ~SvnLinkEditor);
1067
m_plugin->SetSettings(ssd);
1072
void SubversionView::DoLinkEditor()
1074
if(!(m_plugin->GetSettings().GetFlags() & SvnLinkEditor))
1077
IEditor *editor = m_plugin->GetManager()->GetActiveEditor();
1081
wxString fullPath = editor->GetFileName().GetFullPath();
1082
wxTreeItemId root = m_treeCtrl->GetRootItem();
1083
if(root.IsOk() == false)
1086
wxString basePath = DoGetCurRepoPath();
1087
wxTreeItemIdValue cookie;
1088
wxTreeItemIdValue childCookie;
1089
wxTreeItemId parent = m_treeCtrl->GetFirstChild(root, cookie);
1090
while(parent.IsOk()) {
1091
// Loop over the main nodes 'modified', 'unversioned' etc
1092
if(m_treeCtrl->ItemHasChildren(parent)) {
1093
// Loop over the files under the main nodes
1094
wxTreeItemId child = m_treeCtrl->GetFirstChild(parent, childCookie);
1095
while(child.IsOk()) {
1096
wxTreeItemId match = DoFindFile(child, basePath, fullPath);
1098
m_treeCtrl->UnselectAll();
1099
m_treeCtrl->SelectItem(match);
1100
m_treeCtrl->EnsureVisible(match);
1103
child = m_treeCtrl->GetNextChild(parent, childCookie);
1106
parent = m_treeCtrl->GetNextChild(root, cookie);
1110
void SubversionView::OnActiveEditorChanged(wxCommandEvent& event)
1116
void SubversionView::DisconnectEvents()
1118
EventNotifier::Get()->Disconnect(wxEVT_WORKSPACE_LOADED, wxCommandEventHandler(SubversionView::OnWorkspaceLoaded), NULL, this);
1119
EventNotifier::Get()->Disconnect(wxEVT_WORKSPACE_CLOSED, wxCommandEventHandler(SubversionView::OnWorkspaceClosed), NULL, this);
1120
EventNotifier::Get()->Disconnect(wxEVT_FILE_SAVED, clCommandEventHandler(SubversionView::OnFileSaved), NULL, this);
1121
EventNotifier::Get()->Disconnect(wxEVT_PROJ_FILE_ADDED, clCommandEventHandler(SubversionView::OnFileAdded), NULL, this);
1122
EventNotifier::Get()->Disconnect(wxEVT_FILE_RENAMED, wxCommandEventHandler(SubversionView::OnFileRenamed), NULL, this);
1123
EventNotifier::Get()->Disconnect(wxEVT_ACTIVE_EDITOR_CHANGED, wxCommandEventHandler(SubversionView::OnActiveEditorChanged), NULL, this);
1126
void SubversionView::OnOpenFile(wxCommandEvent& event)
1130
wxArrayTreeItemIds items;
1131
wxArrayString paths;
1132
size_t count = m_treeCtrl->GetSelections(items);
1133
for(size_t i=0; i<count; i++) {
1134
wxTreeItemId item = items.Item(i);
1136
if(item.IsOk() == false)
1139
SvnTreeData *data = (SvnTreeData *)m_treeCtrl->GetItemData(item);
1140
if (data && data->GetType() == SvnTreeData::SvnNodeTypeFile) {
1141
paths.Add(DoGetCurRepoPath() + wxFileName::GetPathSeparator() + data->GetFilepath());
1145
for(size_t i=0; i<paths.GetCount(); i++) {
1147
if(wxFileName(paths.Item(i)).IsDir() == false)
1148
m_plugin->GetManager()->OpenFile(paths.Item(i));
1153
void SubversionView::OnSwitch(wxCommandEvent& event)
1156
m_plugin->DoGetSvnInfoSync(svnInfo, DoGetCurRepoPath());
1157
m_plugin->DoSwitchURL(DoGetCurRepoPath(), svnInfo.m_sourceUrl, event);
1160
void SubversionView::OnProperties(wxCommandEvent& event)
1163
m_plugin->DoGetSvnInfoSync(svnInfo, DoGetCurRepoPath());
1165
SvnPropsDlg dlg(m_plugin->GetManager()->GetTheApp()->GetTopWindow(), svnInfo.m_sourceUrl, m_plugin);
1166
if(dlg.ShowModal() == wxID_OK) {
1167
SubversionLocalProperties props(svnInfo.m_sourceUrl);
1168
props.WriteProperty(SubversionLocalProperties::BUG_TRACKER_MESSAGE, dlg.GetBugMsg());
1169
props.WriteProperty(SubversionLocalProperties::BUG_TRACKER_URL, dlg.GetBugTrackerURL());
1170
props.WriteProperty(SubversionLocalProperties::FR_TRACKER_MESSAGE, dlg.GetFRMsg());
1171
props.WriteProperty(SubversionLocalProperties::FR_TRACKER_URL, dlg.GetFRTrackerURL());
1175
void SubversionView::OnLog(wxCommandEvent& event)
1177
m_plugin->ChangeLog(DoGetCurRepoPath(), DoGetCurRepoPath(), event);
1180
void SubversionView::OnLock(wxCommandEvent& event)
1182
wxArrayString files;
1183
for(size_t i=0; i<m_selectionInfo.m_paths.size(); i++) {
1184
wxFileName fn(DoGetCurRepoPath() + wxFileName::GetPathSeparator() + m_selectionInfo.m_paths.Item(i));
1185
files.Add( fn.GetFullPath() );
1187
m_plugin->DoLockFile(DoGetCurRepoPath(), files, event, true);
1190
void SubversionView::OnUnLock(wxCommandEvent& event)
1192
wxArrayString files;
1193
for(size_t i=0; i<m_selectionInfo.m_paths.size(); i++) {
1194
wxFileName fn(DoGetCurRepoPath() + wxFileName::GetPathSeparator() + m_selectionInfo.m_paths.Item(i));
1195
files.Add( fn.GetFullPath() );
1197
m_plugin->DoLockFile(DoGetCurRepoPath(), files, event, false);
1200
void SubversionView::DoChangeRootPathUI(const wxString& path)
1202
if(path == _("<No repository path is selected>")) {
1208
void SubversionView::DoRootDirChanged(const wxString& path)
1210
if(path == _("<No repository path is selected>")) {
1211
DoChangeRootPathUI(path);
1215
// If a workspace is opened, set this new path to the workspace
1216
SvnSettingsData ssd = m_plugin->GetSettings();
1218
const wxArrayString &repos = ssd.GetRepos();
1219
wxArrayString modDirs = repos;
1220
if(modDirs.Index(path) == wxNOT_FOUND) {
1224
ssd.SetRepos(modDirs);
1225
m_plugin->SetSettings(ssd);
1227
if(m_plugin->GetManager()->IsWorkspaceOpen()) {
1228
LocalWorkspaceST::Get()->SetCustomData(wxT("SubversionPath"), path);
1229
LocalWorkspaceST::Get()->Flush();
1231
DoChangeRootPathUI(path);
1236
wxTreeItemId SubversionView::DoGetParentNode(const wxString& filename, const wxTreeItemId& parent)
1238
wxFileName fn(filename);
1239
wxTreeItemId actualParentNode = parent;
1240
wxArrayString dirs = fn.GetDirs();
1242
for(size_t i=0; i<dirs.GetCount(); i++) {
1243
// add or get the parent for this node
1244
curpath << dirs.Item(i) << wxT("/");
1245
actualParentNode = DoFindChild(actualParentNode, dirs.Item(i), curpath);
1247
return actualParentNode;
1250
wxTreeItemId SubversionView::DoFindChild(const wxTreeItemId& parent, const wxString& name, const wxString &curpath)
1252
wxTreeItemIdValue cookie;
1253
wxTreeItemId child = m_treeCtrl->GetFirstChild(parent, cookie);
1254
while( child.IsOk() ) {
1255
if(m_treeCtrl->GetItemText(child) == name) {
1258
child = m_treeCtrl->GetNextChild(parent, cookie);
1260
// if we reached here, we did not find a tree node for this name
1261
return m_treeCtrl->AppendItem(parent, // parent node
1263
FOLDER_IMG_ID, // folder icon
1265
new SvnTreeData(SvnTreeData::SvnNodeTypeFolder, curpath));
1268
void SubversionView::OnRename(wxCommandEvent& event)
1270
wxArrayString files;
1271
for(size_t i=0; i<m_selectionInfo.m_paths.size(); i++) {
1272
wxFileName oldname(DoGetCurRepoPath() + wxFileName::GetPathSeparator() + m_selectionInfo.m_paths.Item(i));
1273
wxString newname = wxGetTextFromUser(_("New name:"), _("Svn rename..."), oldname.GetFullName());
1275
if(newname.IsEmpty() || newname == oldname.GetFullName())
1278
m_plugin->DoRename(DoGetCurRepoPath(), oldname.GetFullName(), newname, event);
1282
wxString SubversionView::DoGetCurRepoPath() const
1287
wxTreeItemId SubversionView::DoFindFile(const wxTreeItemId& parent, const wxString &basepath, const wxString& fullpath)
1289
if(parent.IsOk() == false) {
1290
return wxTreeItemId();
1293
SvnTreeData* data = static_cast<SvnTreeData*>(m_treeCtrl->GetItemData(parent));
1294
if(data && data->GetType() == SvnTreeData::SvnNodeTypeFile) {
1295
wxFileName fn(data->GetFilepath());
1296
fn.MakeAbsolute(basepath);
1297
if(fn.GetFullPath() == fullpath) {
1302
if(m_treeCtrl->ItemHasChildren(parent)) {
1303
wxTreeItemIdValue cookie;
1304
wxTreeItemId child = m_treeCtrl->GetFirstChild(parent, cookie);
1305
while(child.IsOk()) {
1306
wxTreeItemId fileId = DoFindFile(child, basepath, fullpath);
1310
child = m_treeCtrl->GetNextChild(parent, cookie);
1313
return wxTreeItemId();
1316
void SubversionView::DoCreateFileExplorerImages()
1318
// Create new bitmaps for the FileExplorer tree
1319
// The idea here is to add them in the order of the enum of the appearanced in the enum:
1331
if(m_fileExplorerLastBaseImgIdx == -1) {
1332
wxTreeCtrl* fe = m_plugin->GetManager()->GetTree(TreeFileExplorer);
1333
const std::vector<wxBitmap>& images = fe->GetImages();
1334
wxImageList *il = fe->GetImageList();
1336
if(!images.empty() && il) {
1337
int baseImagesCount = images.size();
1338
m_fileExplorerLastBaseImgIdx = baseImagesCount;
1340
for(int i=0; i<baseImagesCount; i++) {
1341
idx = il->Add(SvnOverlayTool::Get().OKIcon(images.at(i)));
1344
for(int i=0; i<baseImagesCount; i++) {
1345
idx = il->Add(SvnOverlayTool::Get().ModifiedIcon(images.at(i)));
1348
for(int i=0; i<baseImagesCount; i++) {
1349
idx = il->Add(SvnOverlayTool::Get().LockedIcon(images.at(i)));
1352
for(int i=0; i<baseImagesCount; i++) {
1353
idx = il->Add(SvnOverlayTool::Get().UnversionedIcon(images.at(i)));
1356
for(int i=0; i<baseImagesCount; i++) {
1357
idx = il->Add(SvnOverlayTool::Get().ConflictIcon(images.at(i)));
1360
for(int i=0; i<baseImagesCount; i++) {
1361
idx = il->Add(SvnOverlayTool::Get().DeletedIcon(images.at(i)));
1364
for(int i=0; i<baseImagesCount; i++) {
1365
idx = il->Add(SvnOverlayTool::Get().NewIcon(images.at(i)));
1370
//int newCount = il->GetImageCount();
1371
//wxPrintf(wxT("%d\n"), newCount);
1376
void SubversionView::OnFileSaved(clCommandEvent& event)
1379
OnRefreshView( event );