Anonymous avatar Anonymous committed baf3d01

merging classes from user_add to user_mod and elimitating user_add

Comments (0)

Files changed (6)

user_add/__init__.py

 #!/usr/bin/env python
 
-#    This file is part of controlcenter.
-#
-#    controlcenter is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License v2 as published by
-#    the Free Software Foundation.
-#
-#    controlcenter 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 controlcenter.  If not, see <http://www.gnu.org/licenses/>.
-'''
-User add/modify module.
-
-Allows the system administrator to add and modify existing user accounts
-'''
+'''User modidification module.
+Contains classes and methods for the user account manager module'''
Add a comment to this file

user_add/__init__.pyc

Binary file removed.

user_add/user_add.py

-#!/usr/bin/env python
-
-#    This file is part of controlcenter.
-#
-#    controlcenter is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License v2 as published by
-#    the Free Software Foundation.
-#
-#    controlcenter 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 controlcenter.  If not, see <http://www.gnu.org/licenses/>.
-
-
-__author__ = 'Moises Henriquez'
-__author_email__ = 'moc.liamg]ta[xnl.E0M'.replace(']ta[', '@')[::-1]
-
-import gtk
-import os
-
-n_account = None
-tabs_ = []
-g_btOK = None
-
-def _(str): return str
-
-class Account(object):
-    '''Object for a user account. This object will have several properties
-    available. These will be all set to None on a new account, or will
-    default to the stored values on an existing account.
-    '''
-    def __init__(self, new = True):
-        self.is_new = new
-        self.name = None
-        self.homedir = None
-        self.uid = None
-        self.shell = None
-        self.pass1 = None
-        self.pass2 = None
-        self.password = None
-        self.maingroup = None
-        self.groups = []
-        self.login = None
-    
-    def preview(self):
-        '''Prints out the information stored about the user account. This 
-        information will reflect any changes that have been made and is 
-        for mere testing purposes, to make sure all required fields are 
-        filled'''
-        print _('Login Name:'), self.login
-        print _('User Name:'), self.name
-        print _('User ID:'), self.uid
-        print _('Home Directory:'), self.homedir
-        print _('Login Shell:'), self.shell
-        print _('Main Group:'), self.maingroup
-        print _('Groups List:'), ','.join(self.groups)
-        print _('Password: ****** '), 
-        
-    
-    def load(self, login):
-        '''Load the information stored in the system about a user account.
-        Required arguments:
-            login = String representing a valid user name in the system.
-        '''
-        passfile = '/etc/passwd'
-        groupfile = '/etc/group'
-        self.login = login
-        f = open(passfile, 'r')
-        passinfo = f.readlines()
-        f.close()
-        for line in passinfo:
-            if line.startswith(login):
-                spl = line.split(':')
-                uid = spl[2]
-                gid = spl[3]
-                rname = spl[4]
-                homedir = spl[5]
-                shell = spl[6]
-        self.uid = uid
-        self.name = rname
-        self.homedir = homedir
-        self.shell = shell
-        return
-    
-if n_account is None: n_account = Account()
-
-class MainWin(gtk.Window):
-    '''Main window for user add module
-    Arguments:
-        account:    An Account object. Defaults to None for a new account.'''
-    def __init__(self, account = None):
-        print account
-        gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
-        if account: n_account = account
-        self.connect('destroy', gtk.main_quit)
-        self.set_property('title', _('Create User Account'))
-        body = gtk.VBox()
-        self.add(body)
-        self.tabstrip = gtk.Notebook()
-        btnbar = gtk.HBox()
-        
-        body.pack_start(self.tabstrip, True, True, 4)
-        body.pack_start(btnbar, False, False, 4)
-        
-        bt_OK = gtk.Button(_('OK'), gtk.STOCK_OK)
-        bt_OK.connect('clicked', self.preview_account)
-        self.OK = bt_OK
-        bt_Cancel = gtk.Button(_('Cancel'), gtk.STOCK_CANCEL)
-        bt_Cancel.connect('clicked', gtk.main_quit)
-        
-        btnbar.pack_end(bt_OK, False, False, 2)
-        btnbar.pack_end(bt_Cancel, False, False, 2)
-
-        self.set_default_size(400,450)
-        self.set_position(gtk.WIN_POS_CENTER)
-        
-        ## Create tab objects.
-        tab_basic= BasicSettingsTab()
-        tab_privileges = PrivilegesTab()
-        tab_advanced = AdvancedTab()
-        tabs_.append(tab_basic)
-        tabs_.append(tab_privileges)
-        tabs_.append(tab_advanced)
-        
-        ## Add the tabs to the window
-        for tab in tabs_:
-            self.tabstrip.append_page(tab, tab.label)
-    def preview_account(self, widget):
-        '''Trigger account preview'''
-        return n_account.preview()
-        
-    
-    def load_account(self, account):
-        self.n_account.load(account)
-        
-        
-        
-class Tab(gtk.VBox):
-    '''Abstract class for a tab in the user add module 
-    Required Arguments:
-        title:  Title to be used for this tab
-                Title is available after creating the object
-                via tab.label and is returned as a gtk.Label'''
-    def __init__(self, title):
-        gtk.VBox.__init__(self)
-        self.label = gtk.Label(title)
-        
-    def refresh_info(self):
-        ''' This method can be called to refresh the information displayed
-        in this tab. Information is read from the account object'''
-        pass
-    
-    def load_existing_data(self):
-        '''This method will read the data for an existing user account
-        and display it on the tabstrip. This will allow the same tabstrip to be
-        used when creating a new account as well as when editing an existing account'''
-        pass
-
-class SectionLabel(gtk.Label):
-    '''Pre-set widget based on gtk.Label preformatted to be used as a
-    section banner within tabs'''
-    def __init__(self, text):
-        gtk.Label.__init__(self)
-        self.set_property('use-markup', True)
-        self.set_property('label', '<b>%s</b>'% text)
-        self.set_property('xalign', 0.0)
-        self.set_property('xpad', 12)
-        
-class LineLabel(gtk.Label):
-    '''Pre-set widget based on gtk.Label pre-formatted to be used as a 
-    label in instances where a label is needed before another widget'''
-    def __init__(self, text):
-        gtk.Label.__init__(self)
-        self.set_property('use-markup', True)
-        self.set_property('label', text)
-        self.set_property('xalign', 0.0)
-        self.set_property('width-chars', 13)    ## Fixme: Fixed width for these?
-        
-
-class BasicSettingsTab(Tab):
-    '''Tab displaying the basic settings for the user add module'''
-    def load_existing_data(self):
-        '''Loads the existing data about the user account to the appropriate widgets'''
-        self.login_txt.set_text(n_account.login)
-        self.login_txt.set_sensitive(False)
-        self.name_txt.set_text(n_account.name)
-        return
-    
-    def update_login(self, widget):
-        '''Update login name field for user account'''
-        n_account.login = widget.get_text().strip() ## FIXME: strip this??
-        ## Also update the home directory
-        n_account.homedir = os.path.join('/home', n_account.login)
-        
-        ## Display this value on the advanced tab
-        for tab in tabs_:
-            tab.refresh_info()
-    
-    def update_realname(self, widget):
-        '''Update the real name field for user account'''
-        n_account.name = widget.get_text().strip()  ## FIXME: strip this??
-    def set_pass_1(self, widget):
-        '''Set the first password entry for user account'''
-        n_account.password = widget.get_text()
-        
-    def verify_password(self, pass2):
-        ''' Make sure both password entires match'''
-        if pass2 == n_account.password:
-            return True
-        return False
-    def set_pass_2(self, widget):
-        '''Set the second password for the user account. Just to make sure'''
-        if g_btOK:
-            g_btOK.set_sensitive(self.verify_password(widget.get_text()))
-        else:
-            print 'no OK button'
-            
-        
-    def __init__(self):
-        Tab.__init__(self, _('Basic Settings'))
-        banner = SectionLabel(_('Basic Information'))
-        self.pack_start(banner, False, False, 4)
-        
-        spacer = gtk.Label()
-        self.pack_start(spacer, False, False, 4)
-        line_name = gtk.HBox()
-        login_label = LineLabel(_('Login Name'))
-        login_txtbox = gtk.Entry()
-        login_txtbox.connect('changed', self.update_login)
-        self.login_txt = login_txtbox
-        line_name.pack_start(login_label, False, False, 2)
-        line_name.pack_start(login_txtbox, True, True, 2)
-        self.pack_start(line_name, False, False, 4)
-        
-        rname_box = gtk.HBox()
-        rname_label = LineLabel(_('Real Name'))
-        rname_txt = gtk.Entry()
-        rname_txt.connect('changed', self.update_realname)
-        self.name_txt = rname_txt
-        rname_box.pack_start(rname_label, False, False, 2)
-        rname_box.pack_start(rname_txt, True, True, 2)
-        self.pack_start(rname_box, False, False, 4)
-        
-        spacer = gtk.Label()
-        self.pack_start(spacer, False, False, 4)
-        
-        banner1 = SectionLabel(_('Password'))
-        self.pack_start(banner1, False, False, 4)
-        pass1_box = gtk.HBox()
-        pass2_box = gtk.HBox()
-        pass1_label = LineLabel(_('User Password'))
-        pass1_txt = gtk.Entry()
-        pass1_txt.connect('changed', self.set_pass_1)
-        self.pass1_box = pass1_txt
-        pass1_txt.set_property('visibility', False)
-        pass1_box.pack_start(pass1_label, False, False, 2)
-        pass1_box.pack_start(pass1_txt, True, True, 2)
-        
-        pass2_label = LineLabel(_('Confirm Password'))
-        pass2_txt = gtk.Entry()
-        pass2_txt.connect('changed', self.set_pass_2)
-        self.pass2_box = pass2_txt
-        pass2_txt.set_property('visibility', False)
-        pass2_box.pack_start(pass2_label, False, False, 2)
-        pass2_box.pack_start(pass2_txt, True, True, 2)
-        
-        self.pack_start(pass1_box, False, False, 4)
-        self.pack_start(pass2_box, False, False, 4)
-    
-
-class PrivilegesTab(Tab):
-    '''User privileges tab that allows the administrator to pick and choose what
-    the user is allowed to do on the system'''
-    def __init__(self):
-        Tab.__init__(self, _('Privileges'))
-        banner = SectionLabel(_('User Privileges'))
-        self.pack_start(banner, False, False, 4)
-        self.rights_values = [
-        ('lpadmin', True,  _('Manage system printers')), \
-        ('scaner', False, _('Use scanners')), \
-        ('video', True, _('Capture video from TV or webcam'))
-        ]
-        
-        ## set default grouplist
-        for entry in self.rights_values:
-            if entry[1]:
-                n_account.groups.append(entry[0])
-        
-        sw = gtk.ScrolledWindow()
-        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
-        tv = self._get_tree()
-        sw.add(tv)
-        self.pack_start(sw, True, True, 4)
-    
-    def _get_tree(self):
-        '''Internal function that pvides a treeview with a list of
-        checkbuttons to check off user access'''
-        rights = self.rights_values
-        store = gtk.ListStore(str, bool, str)
-        for right in rights:
-            store.append([right[0], right[1], right[2]])
-        
-        tree = gtk.TreeView(store)
-        cell0 = gtk.CellRendererToggle()
-        cell0.set_property('activatable', True)
-        cell0.connect('toggled', self.checkbox_toggle, tree.get_model())
-        col0 = gtk.TreeViewColumn(None, cell0)
-        col0.add_attribute(cell0, 'active', 1)
-        
-        cell1 = gtk.CellRendererText()
-        col1 = gtk.TreeViewColumn(None, cell1, text=2)
-        tree.append_column(col0)
-        tree.append_column(col1)
-        
-        return tree
-    
-    def checkbox_toggle(self, widget, path, model):
-        model[path][1] = not model[path][1]
-        for item in model:
-            if item[1]:
-                if not item[0] in n_account.groups:
-                    n_account.groups.append(item[0].strip())
-            else:
-                if item[0] in n_account.groups:
-                    n_account.groups.remove(item[0].strip())
-                
-        print n_account.groups
-
-
-class AdvancedTab(Tab):
-    '''Advanced settings tab.
-    This tab will provide advanced settings for creating a user account.
-    These settings are optional and default to the system defaults.
-    '''
-    
-    def refresh_info(self):
-        '''Reflect changes made to the home directory especially from the
-        basic settings tab.'''
-        self.homedir_box.set_text(n_account.homedir)
-        
-    def load_existing_data(self):
-        self.homedir_box.set_text(n_account.homedir)
-        self.homedir_box.set_sensitive(False)
-        self.uid_spinner.set_value(float(n_account.uid))
-        self.uid_spinner.set_sensitive(False)
-        model = self.shell_sel_combo.get_model()
-        n = 0
-        for item in model:
-            n += 1
-        for x in range(0, n):
-            if model[x][0].strip() == n_account.shell.strip():
-                #print 'found %s in combobox. Setting as active'% n_account.shell.strip()
-                self.shell_sel_combo.set_active(x)
-                self.shell_sel_combo.set_sensitive(False) ## Fixme: Disabled for now
-                break
-    
-    def update_homedir(self, widget):
-        '''Update the home directory on the account to the value specified in the
-        advanced tab'''
-        n_account.homedir = widget.get_text()
-    
-    def update_maingroup(self, widget):
-        '''Update the user's main group to the value selected from the
-        advanced tab'''
-        n_account.maingroup = widget.get_active_text()
-    
-    def update_shell(self, widget):
-        '''Update the user's login shell to the value selected from the
-        advanced tab'''
-        n_account.shell = widget.get_active_text()
-    
-    def update_uid(self, widget):
-        '''Update the uid value to the value selected from the advanced tab'''
-        n_account.uid = int(widget.get_value())
-        
-        
-
-    def __init__(self):
-        Tab.__init__(self, _('Advanced'))
-        banner = SectionLabel(_('Advanced Settings'))
-        spacer = gtk.Label()
-        self.pack_start(banner, False, False, 4)
-        self.pack_start(spacer, False, False, 4)
-        
-        homedir_line = gtk.HBox()
-        homedir_label = LineLabel(_('Home Directory'))
-        homedir_txt = gtk.Entry()
-        homedir_txt.connect('changed', self.update_homedir)
-        self.homedir_box = homedir_txt
-        homedir_line.pack_start(homedir_label, False, False, 2)
-        homedir_line.pack_start(homedir_txt, True, True, 2)
-        self.pack_start(homedir_line, False, False, 4)
-        
-        maingroup_line = gtk.HBox()
-        maingroup_label = LineLabel(_('Main Group'))
-        ulist = gtk.ListStore(str)
-        ## Read /etc/group and list all groups =< 100  <-- FIXME:
-        f = open('/etc/group', 'r')
-        glist = f.readlines()
-        f.close()
-        ulist.append(['Default (username)']) ## Defaults to user name
-        for line in glist:
-            spl = line.split(':')
-            if int(spl[2]) > 0 and int(spl[2]) <= 100:
-                ulist.append([spl[0].strip()])
-        ## FIXME: ^^ User group policy?
-        maingroup_sel = gtk.ComboBox(ulist)
-        maingroup_sel.connect('changed', self.update_maingroup)
-        self.main_group_combo = maingroup_sel
-        cell0 = gtk.CellRendererText()
-        maingroup_sel.pack_start(cell0, True)
-        maingroup_sel.add_attribute(cell0, 'text', 0)
-        maingroup_sel.set_active(0)
-        maingroup_line.pack_start(maingroup_label, False, False, 2)
-        maingroup_line.pack_start(maingroup_sel, True, True, 2)
-        self.pack_start(maingroup_line, False, False, 4)
-        
-        shell_line = gtk.HBox()
-        shell_label = LineLabel('Login Shell')
-        shell_list = gtk.ListStore(str)
-        shell_sel = gtk.ComboBox(shell_list)
-        shell_sel.connect('changed', self.update_shell)
-
-        self.shell_sel_combo = shell_sel
-        
-        ## Read /etc/shells if it exists to get the default shells available
-        if os.path.exists('/etc/shells'):
-            f = open('/etc/shells', 'r')
-            shells = f.readlines()
-            f.close()
-            for shell in shells:
-                shell_list.append([shell.strip()])
-        elif os.path.exists('/bin/bash'):
-            ## if /etc/shells doesn't exist, but /bin/bash does
-            shell_list.append(['/bin/bash'])
-        else:
-            ## No shells available???
-            shell_sel.set_sensitive(False)
-        cell = gtk.CellRendererText()
-        shell_sel.pack_start(cell, True)
-        shell_sel.add_attribute(cell, 'text', 0)
-        
-        shell_sel.set_active(0)
-        
-        shell_line.pack_start(shell_label, False, False, 2)
-        shell_line.pack_start(shell_sel, True, True, 2)
-        self.pack_start(shell_line, False, False, 4)
-        
-        uid_line = gtk.HBox()
-        uid_label = LineLabel(_('User ID'))
-        min_ = 1000
-        n_list = []
-        f = open('/etc/passwd', 'r')
-        entries = f.readlines()
-        f.close()
-        for line in entries:
-            spl = line.split(':')
-            if int(spl[2]) >= 1000:
-                n_list.append(int(spl[2]))
-        n_list.sort()
-        min_ = max(n_list)+1
-        ## Set default value to the user account
-        n_account.uid = int(min_)
-        adj = gtk.Adjustment(1000, min_, 10000, 1, 10, 0)
-        uid_spinner = gtk.SpinButton(adj, 0, 0)
-        uid_spinner.connect('value-changed', self.update_uid)
-        self.uid_spinner = uid_spinner
-        uid_line.pack_start(uid_label, False, False, 2)
-        uid_line.pack_start(uid_spinner, True, True, 2)
-        self.pack_start(uid_line, False, False, 4)
-    
-if __name__ == '__main__':
-    n_account = Account()
-    w = MainWin()
-    g_btOK = w.OK
-    g_btOK.set_sensitive(False) ## Disable the OK button until the password is provided
-    w.show_all()
-    gtk.main()
Add a comment to this file

user_add/user_add.pyc

Binary file removed.

user_add/user_mod.py

 
 import gtk
 import os
-from user_add import Account as Account
-from user_add import Tab as Tab
-from user_add import SectionLabel as SectionLabel
-from user_add import LineLabel as LineLabel
 
 __tabs__ = []
 
 def _(str): return str
 
+class LineLabel(gtk.Label):
+    '''Pre-set widget based on gtk.Label pre-formatted to be used as a 
+    label in instances where a label is needed before another widget'''
+    def __init__(self, text):
+        gtk.Label.__init__(self)
+        self.set_property('use-markup', True)
+        self.set_property('label', text)
+        self.set_property('xalign', 0.0)
+        self.set_property('width-chars', 13)    ## Fixme: Fixed width for these?
+        
+
+
+class SectionLabel(gtk.Label):
+    '''Pre-set widget based on gtk.Label preformatted to be used as a
+    section banner within tabs'''
+    def __init__(self, text):
+        gtk.Label.__init__(self)
+        self.set_property('use-markup', True)
+        self.set_property('label', '<b>%s</b>'% text)
+        self.set_property('xalign', 0.0)
+        self.set_property('xpad', 12)
+        
+
+class Tab(gtk.VBox):
+    '''Abstract class for a tab in the user add module 
+    Required Arguments:
+        title:  Title to be used for this tab
+                Title is available after creating the object
+                via tab.label and is returned as a gtk.Label'''
+    def __init__(self, title):
+        gtk.VBox.__init__(self)
+        self.label = gtk.Label(title)
+        
+    def refresh_info(self):
+        ''' This method can be called to refresh the information displayed
+        in this tab. Information is read from the account object'''
+        pass
+    
+    def load_existing_data(self):
+        '''This method will read the data for an existing user account
+        and display it on the tabstrip. This will allow the same tabstrip to be
+        used when creating a new account as well as when editing an existing account'''
+        pass
+
+class Account(object):
+    '''Object for a user account. This object will have several properties
+    available. These will be all set to None on a new account, or will
+    default to the stored values on an existing account.
+    '''
+    def __init__(self, new = True):
+        self.is_new = new
+        self.name = None
+        self.homedir = None
+        self.uid = None
+        self.shell = None
+        self.pass1 = None
+        self.pass2 = None
+        self.password = None
+        self.maingroup = None
+        self.groups = []
+        self.login = None
+    
+    def preview(self):
+        '''Prints out the information stored about the user account. This 
+        information will reflect any changes that have been made and is 
+        for mere testing purposes, to make sure all required fields are 
+        filled'''
+        print _('Login Name:'), self.login
+        print _('User Name:'), self.name
+        print _('User ID:'), self.uid
+        print _('Home Directory:'), self.homedir
+        print _('Login Shell:'), self.shell
+        print _('Main Group:'), self.maingroup
+        print _('Groups List:'), ','.join(self.groups)
+        print _('Password: ****** '), 
+        
+    
+    def load(self, login):
+        '''Load the information stored in the system about a user account.
+        Required arguments:
+            login = String representing a valid user name in the system.
+        '''
+        passfile = '/etc/passwd'
+        groupfile = '/etc/group'
+        self.login = login
+        f = open(passfile, 'r')
+        passinfo = f.readlines()
+        f.close()
+        for line in passinfo:
+            if line.startswith(login):
+                spl = line.split(':')
+                uid = spl[2]
+                gid = spl[3]
+                rname = spl[4]
+                homedir = spl[5]
+                shell = spl[6]
+        self.uid = uid
+        self.name = rname
+        self.homedir = homedir
+        self.shell = shell
+        return
+
 class Win(gtk.Window):
     '''User add/edit window
         Arguments:
     def set_user_real_name(self, widget):
         ''' Set the comment or real name on the account '''
         self.account.name = widget.get_text()
-        
-        
-        
-        

user_add/users_manage.py

 __author_email__ = 'moc.liamg]ta[xnl.E0M'.replace(']ta[', '@')[::-1]
 
 import gtk
-import user_add
 import user_mod
 
 def _(str): return str
 
-
 class Win(gtk.Window):
     '''Main users management window'''
     def __init__(self):
         
         if not self._selected_user: return
         
-        sel_user = user_add.Account(new = False)
+        sel_user = user_mod.Account(new = False)
         sel_user.load(self._selected_user)
         if not self.__modwin: self.__modwin = user_mod.Win(sel_user)
         
         self.__modwin = user_mod.Win(sel_user)
         self.__modwin.set_title(sel_user.login + ' '+ _('Account Properties'))
         self.__modwin.show_all()
-        #propw = user_mod.Win(account = sel_user)
-        #propw = user_add.MainWin(account=sel_user)
-        #propw.set_modal(True)
-        #propw.set_default_size(350, 450)
-        #propw.set_title(sel_user.login + ' ' +  _('Account Properties'))
-        #propw.show_all()
-        
+
     def _get_user_lists(self):
         '''Returns a list of 3-tuples containing (user real name, login, homedir)'''
         ret = []
                 ret.append((spl[4], spl[0], spl[-2]))
         return ret
     def _get_tree(self):
+        ''' Internal method used to generate a treeview widget containing
+        the necessary internal widgets for the user management list'''
         lst = gtk.ListStore(str, str, str)
         users = self._get_user_lists()
         for user in users:
         self.tree.append_column(col2)
         
         self.tree.connect('cursor-changed', self.tree_select)
-        #self.tree.connect('row-activated', self.tree_select)
         return self.tree
     def tree_select(self, widget):
+        ''' Events triggered when the user clicks on one of the user accounts
+        on the account manager'''
         sel_row = widget.get_cursor()[0][0]
-        #print sel_row
         self._selected_user = widget.get_model()[sel_row][1]
 
     def add_user(self, widget):
         ''' Launch the add user dialog.'''
-        acct = user_add.Account(new = True)
+        acct = user_mod.Account(new = True)
+        self.__modwin = None
         if not self.__modwin: self.__modwin = user_mod.Win(acct)
         self.__modwin.set_title(_('Add new user'))
         self.__modwin.show_all()
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.