1
# Copyright (C) 2006 by Szilveszter Farkas (Phanatic) <szilveszter.farkas@gmail.com>
 
 
3
# This program is free software; you can redistribute it and/or modify
 
 
4
# it under the terms of the GNU General Public License as published by
 
 
5
# the Free Software Foundation; either version 2 of the License, or
 
 
6
# (at your option) any later version.
 
 
8
# This program is distributed in the hope that it will be useful,
 
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
 
11
# GNU General Public License for more details.
 
 
13
# You should have received a copy of the GNU General Public License
 
 
14
# along with this program; if not, write to the Free Software
 
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 
31
import bzrlib.errors as errors
 
 
32
from bzrlib.branch import Branch
 
 
34
from dialog import OliveDialog
 
 
35
from menu import OliveMenu
 
 
36
from launch import launch
 
 
39
    """ Signal handler class for Olive. """
 
 
40
    def __init__(self, gladefile, comm):
 
 
41
        self.gladefile = gladefile
 
 
44
        self.dialog = OliveDialog(self.gladefile)
 
 
46
        self.menu = OliveMenu(self.gladefile, self.comm, self.dialog)
 
 
48
    def on_about_activate(self, widget):
 
 
51
    def on_menuitem_add_files_activate(self, widget):
 
 
52
        """ Add file(s)... menu handler. """
 
 
53
        from add import OliveAdd
 
 
54
        add = OliveAdd(self.gladefile, self.comm, self.dialog)
 
 
57
    def on_menuitem_branch_get_activate(self, widget):
 
 
58
        """ Branch/Get... menu handler. """
 
 
59
        from branch import OliveBranch
 
 
60
        branch = OliveBranch(self.gladefile, self.comm, self.dialog)
 
 
63
    def on_menuitem_branch_checkout_activate(self, widget):
 
 
64
        """ Branch/Checkout... menu handler. """
 
 
65
        from checkout import OliveCheckout
 
 
66
        checkout = OliveCheckout(self.gladefile, self.comm, self.dialog)
 
 
69
    def on_menuitem_branch_commit_activate(self, widget):
 
 
70
        """ Branch/Commit... menu handler. """
 
 
71
        from commit import OliveCommit
 
 
72
        commit = OliveCommit(self.gladefile, self.comm, self.dialog)
 
 
75
    def on_menuitem_branch_missing_revisions_activate(self, widget):
 
 
76
        """ Branch/Missing revisions menu handler. """
 
 
78
        self.comm.set_busy(self.comm.window_main)
 
 
84
                local_branch = Branch.open_containing(self.comm.get_path())[0]
 
 
85
            except NotBranchError:
 
 
86
                self.dialog.error_dialog(_('Directory is not a branch'),
 
 
87
                                         _('You can perform this action only in a branch.'))
 
 
90
            other_branch = local_branch.get_parent()
 
 
91
            if other_branch is None:
 
 
92
                self.dialog.error_dialog(_('Parent location is unknown'),
 
 
93
                                         _('Cannot determine missing revisions if no parent location is known.'))
 
 
96
            remote_branch = Branch.open(other_branch)
 
 
98
            if remote_branch.base == local_branch.base:
 
 
99
                remote_branch = local_branch
 
 
101
            ret = len(local_branch.missing_revisions(remote_branch))
 
 
104
                self.dialog.info_dialog(_('There are missing revisions'),
 
 
105
                                        _('%d revision(s) missing.') % ret)
 
 
107
                self.dialog.info_dialog(_('Local branch up to date'),
 
 
108
                                        _('There are no missing revisions.'))
 
 
110
            self.comm.set_busy(self.comm.window_main, False)
 
 
112
    def on_menuitem_branch_pull_activate(self, widget):
 
 
113
        """ Branch/Pull menu handler. """
 
 
115
        self.comm.set_busy(self.comm.window_main)
 
 
119
                from bzrlib.workingtree import WorkingTree
 
 
120
                tree_to = WorkingTree.open_containing(self.comm.get_path())[0]
 
 
121
                branch_to = tree_to.branch
 
 
122
            except errors.NoWorkingTree:
 
 
124
                branch_to = Branch.open_containing(self.comm.get_path())[0]
 
 
125
            except errors.NotBranchError:
 
 
126
                 self.dialog.error_dialog(_('Directory is not a branch'),
 
 
127
                                         _('You can perform this action only in a branch.'))
 
 
129
            location = branch_to.get_parent()
 
 
131
                self.dialog.error_dialog(_('Parent location is unknown'),
 
 
132
                                         _('Pulling is not possible until there is a parent location.'))
 
 
136
                branch_from = Branch.open(location)
 
 
137
            except errors.NotBranchError:
 
 
138
                self.dialog.error_dialog(_('Directory is not a branch'),
 
 
139
                                         _('You can perform this action only in a branch.'))
 
 
141
            if branch_to.get_parent() is None:
 
 
142
                branch_to.set_parent(branch_from.base)
 
 
144
            old_rh = branch_to.revision_history()
 
 
145
            if tree_to is not None:
 
 
146
                tree_to.pull(branch_from)
 
 
148
                branch_to.pull(branch_from)
 
 
150
            self.dialog.info_dialog(_('Pull successful'),
 
 
151
                                    _('%d revision(s) pulled.') % ret)
 
 
154
            self.comm.set_busy(self.comm.window_main, False)
 
 
156
    def on_menuitem_branch_push_activate(self, widget):
 
 
157
        """ Branch/Push... menu handler. """
 
 
158
        from push import OlivePush
 
 
159
        push = OlivePush(self.gladefile, self.comm, self.dialog)
 
 
162
    def on_menuitem_branch_status_activate(self, widget):
 
 
163
        """ Branch/Status... menu handler. """
 
 
164
        from status import OliveStatus
 
 
165
        status = OliveStatus(self.gladefile, self.comm, self.dialog)
 
 
168
    def on_menuitem_branch_initialize_activate(self, widget):
 
 
169
        """ Initialize current directory. """
 
 
171
            location = self.comm.get_path()
 
 
172
            from bzrlib.builtins import get_format_type
 
 
174
            format = get_format_type('default')
 
 
176
            if not os.path.exists(location):
 
 
180
                existing_bzrdir = bzrdir.BzrDir.open(location)
 
 
181
            except NotBranchError:
 
 
182
                bzrdir.BzrDir.create_branch_convenience(location, format=format)
 
 
184
                if existing_bzrdir.has_branch():
 
 
185
                    if existing_bzrdir.has_workingtree():
 
 
186
                        raise AlreadyBranchError(location)
 
 
188
                        raise BranchExistsWithoutWorkingTree(location)
 
 
190
                    existing_bzrdir.create_branch()
 
 
191
                    existing_bzrdir.create_workingtree()
 
 
192
        except errors.AlreadyBranchError, errmsg:
 
 
193
            self.dialog.error_dialog(_('Directory is already a branch'),
 
 
194
                                     _('The current directory (%s) is already a branch.\nYou can start using it, or initialize another directory.') % errmsg)
 
 
195
        except errors.BranchExistsWithoutWorkingTree, errmsg:
 
 
196
            self.dialog.error_dialog(_('Branch without a working tree'),
 
 
197
                                     _('The current directory (%s)\nis a branch without a working tree.') % errmsg)
 
 
199
            self.dialog.info_dialog(_('Initialize successful'),
 
 
200
                                    _('Directory successfully initialized.'))
 
 
201
            self.comm.refresh_right()
 
 
203
    def on_menuitem_file_make_directory_activate(self, widget):
 
 
204
        """ File/Make directory... menu handler. """
 
 
205
        from mkdir import OliveMkdir
 
 
206
        mkdir = OliveMkdir(self.gladefile, self.comm, self.dialog)
 
 
209
    def on_menuitem_file_move_activate(self, widget):
 
 
210
        """ File/Move... menu handler. """
 
 
211
        from move import OliveMove
 
 
212
        move = OliveMove(self.gladefile, self.comm, self.dialog)
 
 
215
    def on_menuitem_file_rename_activate(self, widget):
 
 
216
        """ File/Rename... menu handler. """
 
 
217
        from rename import OliveRename
 
 
218
        rename = OliveRename(self.gladefile, self.comm, self.dialog)
 
 
221
    def on_menuitem_remove_file_activate(self, widget):
 
 
222
        """ Remove (unversion) selected file. """
 
 
223
        from remove import OliveRemove
 
 
224
        remove = OliveRemove(self.gladefile, self.comm, self.dialog)
 
 
227
    def on_menuitem_stats_diff_activate(self, widget):
 
 
228
        """ Statistics/Differences... menu handler. """
 
 
229
        from diff import OliveDiff
 
 
230
        diff = OliveDiff(self.gladefile, self.comm, self.dialog)
 
 
233
    def on_menuitem_stats_infos_activate(self, widget):
 
 
234
        """ Statistics/Informations... menu handler. """
 
 
235
        from info import OliveInfo
 
 
236
        info = OliveInfo(self.gladefile, self.comm, self.dialog)
 
 
239
    def on_menuitem_stats_log_activate(self, widget):
 
 
240
        """ Statistics/Log... menu handler. """
 
 
241
        from log import OliveLog
 
 
242
        log = OliveLog(self.gladefile, self.comm, self.dialog)
 
 
245
    def on_menuitem_view_refresh_activate(self, widget):
 
 
246
        """ View/Refresh menu handler. """
 
 
247
        # Refresh the left pane
 
 
248
        self.comm.refresh_left()
 
 
249
        # Refresh the right pane
 
 
250
        self.comm.refresh_right()
 
 
252
    def on_menuitem_view_show_hidden_files_activate(self, widget):
 
 
253
        """ View/Show hidden files menu handler. """
 
 
254
        if widget.get_active():
 
 
256
            self.comm.pref.set_preference('dotted_files', True)
 
 
257
            self.comm.pref.refresh()
 
 
258
            self.comm.refresh_right()
 
 
260
            # Do not show hidden files
 
 
261
            self.comm.pref.set_preference('dotted_files', False)
 
 
262
            self.comm.pref.refresh()
 
 
263
            self.comm.refresh_right()
 
 
265
    def on_treeview_left_button_press_event(self, widget, event):
 
 
266
        """ Occurs when somebody right-clicks in the bookmark list. """
 
 
267
        if event.button == 3:
 
 
268
            # Don't show context with nothing selected
 
 
269
            if self.comm.get_selected_left() == None:
 
 
272
            self.menu.left_context_menu().popup(None, None, None, 0,
 
 
275
    def on_treeview_left_row_activated(self, treeview, path, view_column):
 
 
276
        """ Occurs when somebody double-clicks or enters an item in the
 
 
279
        newdir = self.comm.get_selected_left()
 
 
283
        self.comm.set_busy(treeview)
 
 
284
        self.comm.set_path(newdir)
 
 
285
        self.comm.refresh_right()
 
 
286
        self.comm.set_busy(treeview, False)
 
 
288
    def on_treeview_right_button_press_event(self, widget, event):
 
 
289
        """ Occurs when somebody right-clicks in the file list. """
 
 
290
        if event.button == 3:
 
 
292
            m_add = self.menu.ui.get_widget('/context_right/add')
 
 
293
            m_remove = self.menu.ui.get_widget('/context_right/remove')
 
 
294
            m_commit = self.menu.ui.get_widget('/context_right/commit')
 
 
295
            m_diff = self.menu.ui.get_widget('/context_right/diff')
 
 
296
            # check if we're in a branch
 
 
298
                from bzrlib.branch import Branch
 
 
299
                Branch.open_containing(self.comm.get_path())
 
 
300
                m_add.set_sensitive(False)
 
 
301
                m_remove.set_sensitive(False)
 
 
302
                m_commit.set_sensitive(False)
 
 
303
                m_diff.set_sensitive(False)
 
 
304
            except errors.NotBranchError:
 
 
305
                m_add.set_sensitive(True)
 
 
306
                m_remove.set_sensitive(True)
 
 
307
                m_commit.set_sensitive(True)
 
 
308
                m_diff.set_sensitive(True)
 
 
309
            self.menu.right_context_menu().popup(None, None, None, 0,
 
 
312
    def on_treeview_right_row_activated(self, treeview, path, view_column):
 
 
313
        """ Occurs when somebody double-clicks or enters an item in the
 
 
317
        newdir = self.comm.get_selected_right()
 
 
320
            self.comm.set_path(os.path.split(self.comm.get_path())[0])
 
 
322
            fullpath = self.comm.get_path() + os.sep + newdir
 
 
323
            if os.path.isdir(fullpath):
 
 
324
                # selected item is an existant directory
 
 
325
                self.comm.set_path(fullpath)
 
 
329
        self.comm.refresh_right()
 
 
331
    def on_window_main_delete_event(self, widget, event=None):
 
 
332
        """ Do some stuff before exiting. """
 
 
333
        width, height = self.comm.window_main.get_size()
 
 
334
        self.comm.pref.set_preference('window_width', width)
 
 
335
        self.comm.pref.set_preference('window_height', height)
 
 
336
        x, y = self.comm.window_main.get_position()
 
 
337
        self.comm.pref.set_preference('window_x', x)
 
 
338
        self.comm.pref.set_preference('window_y', y)
 
 
339
        self.comm.pref.set_preference('paned_position',
 
 
340
                                      self.comm.hpaned_main.get_position())
 
 
342
        self.comm.pref.write()
 
 
343
        self.comm.window_main.destroy()
 
 
345
    def not_implemented(self, widget):
 
 
346
        """ Display a Not implemented error message. """
 
 
347
        self.dialog.error_dialog(_('We feel sorry'),
 
 
348
                                 _('This feature is not yet implemented.'))