diff options
Diffstat (limited to 'apol/level_dialog.tcl')
-rw-r--r-- | apol/level_dialog.tcl | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/apol/level_dialog.tcl b/apol/level_dialog.tcl new file mode 100644 index 0000000..181cc3c --- /dev/null +++ b/apol/level_dialog.tcl @@ -0,0 +1,82 @@ +# Copyright (C) 2005-2007 Tresys Technology, LLC +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program 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 this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace eval Apol_Level_Dialog { + variable dialog "" + variable vars +} + +# Create a dialog box to allow the user to select a single MLS level. +# Return an instance of an apol_mls_level. If no level is selected +# then return an empty list; otherwise return the level. The caller +# must delete it afterwards. +proc Apol_Level_Dialog::getLevel {{defaultLevel {}} {parent .}} { + variable dialog + if {![winfo exists $dialog]} { + _create_dialog $parent + } + set f [$dialog getframe] + Apol_Widget::resetLevelSelectorToPolicy $f.level + if {$defaultLevel != {}} { + Apol_Widget::setLevelSelectorLevel $f.level $defaultLevel + } + # force a recomputation of button sizes (bug in ButtonBox) + $dialog.bbox _redraw + set retval [$dialog draw] + if {$retval == -1 || $retval == 1} { + return {} + } + _get_level $dialog +} + + +########## private functions below ########## + +proc Apol_Level_Dialog::_create_dialog {parent} { + variable dialog + variable vars + + set dialog [Dialog .level_dialog -modal local -parent $parent \ + -separator 1 -homogeneous 1 -title "Select Level"] + array unset vars $dialog:* + + set f [$dialog getframe] + set label [label $f.ll -text "Level:"] + set level [Apol_Widget::makeLevelSelector $f.level 12] + + pack $label -anchor w + pack $level -expand 1 -fill both + + $dialog add -text "OK" -command [list Apol_Level_Dialog::_okay $dialog] + $dialog add -text "Cancel" +} + +proc Apol_Level_Dialog::_get_level {dialog} { + return [Apol_Widget::getLevelSelectorLevel [$dialog getframe].level] +} + +# Check that the level is legal by validating it against the current +# policy. +proc Apol_Level_Dialog::_okay {dialog} { + set level [_get_level $dialog] + if {![ApolTop::is_policy_open] || [$level validate $::ApolTop::policy] != 1} { + tk_messageBox -icon error -type ok -title "Invalid Level" \ + -message "The selected level is not valid for the current policy." + } else { + $dialog enddialog 0 + } + $level -acquire + $level -delete +} |