summaryrefslogtreecommitdiffstats
path: root/apol/level_dialog.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'apol/level_dialog.tcl')
-rw-r--r--apol/level_dialog.tcl82
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
+}