File Coverage

blib/lib/Gtk2/Net/LDAP/Widgets/LdapTreeSelector.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             # by OLO
2             # czw mar 17 14:10:53 CET 2005
3             # LdapTreeSelector: wielokrotna selekca elementow z drzewa LDAP
4              
5             package Gtk2::Net::LDAP::Widgets::LdapTreeSelector;
6             #---[ pod head ]---{{{
7              
8             =head1 NAME
9              
10             Gtk2::Net::LDAP::Widgets::LdapTreeSelector - LDAP entry tree selection window
11              
12             =head1 SYNOPSIS
13              
14             use Gtk2::Net::LDAP::Widgets;
15              
16             my $entryPopup = Gtk2::Net::LDAP::Widgets::LdapTreeSelector->new ($parent_window,
17             $ldap_source,
18             'o=People,dc=example,dc=com',
19             '(|(objectClass=inetorgperson)(objectClass=organization))',
20             'interactive_filter_type' => 'none',
21             'single_selection' => 1
22             );
23             # expand entries below top-level tree entry:
24             $entryPopup->{ldapTreeView}->expand_row(Gtk2::TreePath->new_from_string('0'), 0);
25             $entryPopup->signal_connect (response => sub {
26             my ($popup, $response) = @_;
27             if($response =~ 'accept') {
28             print "Selected entry DN: ".$entryPopup->get_dn;
29             }
30             $_[0]->destroy;
31             });
32             $entryPopup->show_all;
33              
34             =head1 ABSTRACT
35              
36             Gtk2::Net::LDAP::Widgets::LdapTreeSelector is a child class to L
37             and is used to create a Gtk2 dialog which lets the user select LDAP entry/entries
38             displayed in a tree-like structure.
39              
40             The dialog may be equipped with a search/filter box, although there might be
41             problems with displaying search results when an interactive filter is set since
42             there may be problems building the tree if all ancestors for an entry aren't
43             included in the search result.
44              
45             So it's advised to use this component without displaying a search/filter box
46             ('interactive_filter_type' => 'none').
47              
48             =cut
49              
50             #---}}}
51 1     1   32572 use utf8;
  1         12  
  1         7  
52 1     1   39 use strict;
  1         2  
  1         49  
53 1     1   7 use vars qw(@ISA $VERSION);
  1         2  
  1         81  
54              
55 1     1   1202 use Net::LDAP;
  1         192782  
  1         16  
56 1     1   3416 use Net::LDAP::Util;
  1         64  
  1         53  
57 1     1   401 use Gtk2 -init;
  0            
  0            
58             use Data::Dumper;
59             use Gtk2::Net::LDAP::Widgets::DistinguishedName;
60              
61             @ISA = qw(Gtk2::Dialog);
62              
63             our $VERSION = "2.0.1";
64              
65              
66             use overload
67             q{""} => 'to_string';
68              
69             # determine the filter (internal utility method)
70             sub _get_filter {
71             my $self = shift;
72             if ($self->{interactive_filter_type} eq 'ldap') {
73             return($self->{entryInteractiveFilter}->get_text);
74             } elsif ($self->{interactive_filter_type} eq 'none') {
75             return('');
76             } elsif ($self->{interactive_filter_type} eq 'simple') {
77             return('cn=*'.$self->{entryInteractiveFilter}->get_text.'*');
78             }
79             return('');
80             }
81              
82             #---[ sub new ]---{{{
83              
84             =head1 CONSTRUCTOR
85              
86             =over 4
87              
88             =item new ( parent, ldap_source, base_dn, static_filter, named parameters )
89              
90             Creates a new Gtk2::Net::LDAP::Widgets::LdapTreeSelector object.
91              
92             C the L which will be parent of this L
93              
94             C the L object which is an active connection to an LDAP server
95              
96             C the base DN of LDAP search operations
97              
98             C the static filter that will be logically AND-ed with all filters executed by this selector
99              
100             =back
101              
102             =head2 named parameters
103              
104             =over 4
105              
106             =item init_interactive_filter =E 'some ldap filter'
107              
108             The string to be initially put in the filter box
109              
110             =item single_selection =E 0 | 1
111              
112             Whether to use single selection mode (otherwise multiple selection is posible)
113              
114              
115             =item interactive_filter_type =E 'ldap' | 'simple' | 'none'
116              
117             The type of filter box: 'ldap' supports full LDAP filter syntax, 'simple' does a substring search against the "cn" attribute, 'none' disables the search/filter box.
118              
119             =back
120              
121             =cut
122             sub new {
123             my $class = shift;
124             my $self = $class->SUPER::new('Wybierz wpis(y) LDAP', shift, 'destroy-with-parent',
125             'gtk-ok' => 'accept', 'gtk-cancel' => 'reject');
126             $self->set_modal(1);
127             $self->{ldap_source} = shift;
128             $self->{base_dn} = shift;
129             $self->{static_filter} = shift;
130              
131             my %named_params = @_;
132             $self->{init_interactive_filter} = $named_params{'init_interactive_filter'};
133             $self->{single_selection} = $named_params{'single_selection'};
134             $self->{interactive_filter_type} = $named_params{'interactive_filter_type'};
135             # possible values: 'ldap', 'simple', 'none':
136             if (! $self->{interactive_filter_type}) {
137             $self->{interactive_filter_type} = 'ldap';
138             }
139              
140             my $btnFiltruj = Gtk2::Button->new_with_mnemonic ('_Filtruj');
141             if ($self->{interactive_filter_type} ne 'none') {
142             # The filter horizontal box:
143             my $hboxFilter = Gtk2::HBox->new;
144             my $labelFilter = Gtk2::Label->new;
145             if ($self->{interactive_filter_type} eq 'ldap') {
146             $labelFilter->set_markup("Wpisz filtr LDAP:");
147             } elsif ($self->{interactive_filter_type} eq 'simple') {
148             $labelFilter->set_markup("Wyszukaj:");
149             } else {
150             $labelFilter->set_markup("Wpisz filtr:");
151             }
152             $hboxFilter->pack_start ($labelFilter, 0, 0, 5);
153             my $entryInteractiveFilter = Gtk2::Entry->new;
154             $entryInteractiveFilter->set_text($self->{init_interactive_filter});
155             $hboxFilter->pack_start ($entryInteractiveFilter, 1, 1, 5);
156              
157             $hboxFilter->pack_start ($btnFiltruj, 1, 1, 5);
158              
159             $self->{entryInteractiveFilter} = $entryInteractiveFilter;
160             $self->vbox->pack_start ($hboxFilter, 0, 0, 5);
161             }
162              
163             # Results list component:
164             bless $self, $class;
165             $self->{ldapTreeView} = Gtk2::Net::LDAP::Widgets::LdapTreeView->new($self->{ldap_source}, $self->{base_dn}, $self->{static_filter},
166             $self->_get_filter, $self->{single_selection});
167            
168             my $scrollwin = Gtk2::ScrolledWindow->new;
169             $scrollwin->set_policy ('never', 'automatic');
170             $scrollwin->set_shadow_type ('in');
171             $scrollwin->add($self->{ldapTreeView});
172             $self->vbox->pack_start ($scrollwin, 1, 1, 5);
173              
174             $self->set_default_size(640, 480);
175              
176             $btnFiltruj->signal_connect (clicked => sub {
177             $self->refresh_list;
178             });
179              
180             bless $self, $class;
181              
182             }
183             #---}}}
184              
185             # by OLO
186             # czw mar 17 17:51:20 CET 2005
187             # Conversion of self to string:
188             sub to_string {
189             my $self = shift;
190             return $self->{class}.' "'.\$self.'"';
191             }
192              
193             #---[ sub refresh_list ]---{{{
194             =head2 refresh_list
195              
196             Refresh the entries list - re-execute the search with the filter determined by
197             the search/filter box.
198              
199             =cut
200             sub refresh_list {
201             my $self = shift;
202             my $newfilter = $self->_get_filter;
203             #print "LdapTreeSelector nowy filtr: $newfilter\n";
204             $self->{listEntriesView}->set_interactive_filter($newfilter);
205             }
206             #---}}}
207              
208             #---[ sub get_dn ]---{{{
209              
210             =head2 get_dn
211              
212             Return the list of selected entries' Distinguished Names.
213              
214             The list has at most one entry if single_selection is set to 1.
215              
216             =cut
217             sub get_dn {
218             my $self = shift;
219             return $self->{ldapTreeView}->get_dn;
220             }
221             #---}}}
222              
223             1;
224              
225             __END__