summaryrefslogtreecommitdiff
path: root/lib/configdialogues/terminal_config.tcl
diff options
context:
space:
mode:
authorAndrej Shadura <andrewsh@debian.org>2018-05-08 15:59:31 +0200
committerAndrej Shadura <andrewsh@debian.org>2018-05-08 15:59:31 +0200
commit47aa8b00b2b11df13a100489e0f904a4947177ef (patch)
treeb35c9acc778ea2f761f3c549f7bee2f4491b3144 /lib/configdialogues/terminal_config.tcl
parent5b8466f7fae0e071c0f4eda13051c93313910028 (diff)
Import Upstream version 1.4.7
Diffstat (limited to 'lib/configdialogues/terminal_config.tcl')
-rw-r--r--lib/configdialogues/terminal_config.tcl396
1 files changed, 396 insertions, 0 deletions
diff --git a/lib/configdialogues/terminal_config.tcl b/lib/configdialogues/terminal_config.tcl
new file mode 100644
index 0000000..732b5cb
--- /dev/null
+++ b/lib/configdialogues/terminal_config.tcl
@@ -0,0 +1,396 @@
+#!/usr/bin/tclsh
+# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net )
+
+############################################################################
+# Copyright (C) 2007, 2008, 2009, 2010, 2011, 2012 by Martin Ošmera #
+# martin.osmera@gmail.com #
+# #
+# 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., #
+# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
+############################################################################
+
+# >>> File inclusion guard
+if { ! [ info exists _TERMINAL_CONFIG_TCL ] } {
+set _TERMINAL_CONFIG_TCL _
+# <<< File inclusion guard
+
+# --------------------------------------------------------------------------
+# DESCRIPTION
+# Implements terminal configuration dialog
+# --------------------------------------------------------------------------
+
+namespace eval terminal {
+ variable dialog_opened 0 ;# Bool: True if this dialog is already opened
+ variable win ;# ID of dialog toplevel window
+ variable changed 0 ;# Bool: Settings changed
+ variable example_text ;# Widget: Label widget containing example text
+ variable selected_font ;# Font: Current font
+ variable fg_clr_but ;# Widget: Button for selecting foreground color
+ variable bg_clr_but ;# Widget: Button for selecting background color
+
+ ## Configuration variables
+ variable configuration ;# Array: Configuration array
+
+ ## Create the dialog
+ # @return void
+ proc mkDialog {} {
+ variable win ;# ID of toplevel dialog window
+ variable dialog_opened ;# Bool: True if this dialog is already opened
+ variable configuration ;# Array: Configuration array
+ variable changed ;# Bool: Settings changed
+ variable example_text ;# Widget: Label widget containing example text
+ variable selected_font ;# Font: Current font
+ variable fg_clr_but ;# Widget: Button for selecting foreground color
+ variable bg_clr_but ;# Widget: Button for selecting background color
+
+ # Destroy the dialog if it's already opened
+ if {$dialog_opened} {
+ destroy .terminal_config_dialog
+ }
+
+ set dialog_opened 1
+ set changed 0
+
+ # Get settings from main NS
+ getSettings
+
+ # Create toplevel window
+ set win [toplevel .terminal_config_dialog -class {Configuration dialog} -bg ${::COMMON_BG_COLOR}]
+
+ # Create window header
+ label $win.header_label \
+ -text [mc "Terminal configuration"] \
+ -font [font create -size [expr {int(-20 * $::font_size_factor)}]]
+
+ # Create horizontal separator
+ Separator $win.sep -orient horizontal
+
+ ## Create main frame
+ set main_frame [frame $win.main_frame]
+ set row 0
+ # Foreground color
+ grid [label $main_frame.fg_lbl \
+ -text [mc "Foreground color"] \
+ ] -row $row -column 0 -sticky w
+ set fg_clr_but [button $main_frame.fg_but \
+ -bd 1 -relief raised -pady 0 -width 10 \
+ -bg $configuration(fg) \
+ -activebackground $configuration(fg) \
+ -command "::configDialogues::terminal::select_color {foreground} fg $main_frame.fg_but" \
+ ]
+ grid $fg_clr_but -column 1 -row $row -sticky wens
+ incr row
+ # Background color
+ grid [label $main_frame.bg_lbl \
+ -text [mc "Background color"] \
+ ] -row $row -column 0 -sticky w
+ set bg_clr_but [button $main_frame.bg_but \
+ -bd 1 -relief raised -pady 0 -width 10 \
+ -bg $configuration(bg) \
+ -activebackground $configuration(bg) \
+ -command "::configDialogues::terminal::select_color {background} bg $main_frame.bg_but" \
+ ]
+ grid $bg_clr_but -column 1 -row $row -sticky wens
+ incr row
+ # Font size
+ grid [label $main_frame.font_size_lbl \
+ -text [mc "Font size"] \
+ ] -row $row -column 0 -sticky w
+ grid [ttk::spinbox $main_frame.font_size_spb \
+ -from 4 -to 22 -validate all -width 0 \
+ -validatecommand {::configDialogues::terminal::font_size_valiade %P} \
+ -textvariable ::configDialogues::terminal::configuration(font_size) \
+ -command ::configDialogues::terminal::font_changed \
+ ] -row $row -column 1 -sticky we
+ incr row
+ # Font family
+ grid [label $main_frame.font_family_lbl \
+ -text [mc "Font family"] \
+ ] -row $row -column 0 -sticky w
+ grid [ttk::combobox $main_frame.font_family_cbx \
+ -state readonly \
+ -values [lsort [font families]] \
+ -width 20 \
+ -textvariable ::configDialogues::terminal::configuration(font_family) \
+ ] -row $row -column 1 -sticky we
+ bind $main_frame.font_family_cbx <<ComboboxSelected>> \
+ {::configDialogues::terminal::font_changed}
+ incr row
+ # Example text
+ set selected_font [font create \
+ -family $configuration(font_family) \
+ -size -$configuration(font_size) \
+ ]
+ set example_text [label $main_frame.example_text_lbl \
+ -text "rxvt-unicode " \
+ -font $selected_font \
+ ]
+ grid $example_text -row $row -column 0 -sticky w -columnspan 2
+ # Finalize
+ grid columnconfigure $main_frame 0 -weight 1
+
+ # Button "Restart terminal emulator"
+ set restart_but [ttk::button $win.restart_but \
+ -text [mc "Use settings and restart terminal emulator"] \
+ -compound left \
+ -image ::ICONS::16::reload \
+ -command {::configDialogues::terminal::RESTART} \
+ ]
+
+ ## Button frame at the bottom
+ set but_frame [frame $win.button_frame]
+ # Button "Reset"
+ pack [ttk::button $but_frame.but_default \
+ -text [mc "Reset to defaults"] \
+ -command {::configDialogues::terminal::DEFAULTS} \
+ ] -side left
+ DynamicHelp::add $but_frame.but_default \
+ -text [mc "Reset all settings to defaults"]
+ # Button "Ok"
+ pack [ttk::button $but_frame.but_ok \
+ -text [mc "Ok"] \
+ -compound left \
+ -image ::ICONS::16::ok \
+ -command {::configDialogues::terminal::OK} \
+ ] -side right -padx 2
+ DynamicHelp::add $but_frame.but_ok \
+ -text [mc "Commit new settings"]
+ # Button "Cancel"
+ pack [ttk::button $but_frame.but_cancel \
+ -text [mc "Cancel"] \
+ -compound left \
+ -image ::ICONS::16::button_cancel \
+ -command {::configDialogues::terminal::CANCEL} \
+ ] -side right -padx 2
+ DynamicHelp::add $but_frame.but_cancel \
+ -text [mc "Take changes back and close dialog"]
+
+ # Pack frames and notebook
+ pack $win.header_label -side top -pady 6
+ pack $win.sep -side top -fill x -after $win.header_label
+ pack $main_frame -side top -padx 10 -anchor nw -pady 10 -fill x
+ pack $but_frame -side bottom -fill x -anchor s -padx 10 -pady 5
+ pack $restart_but -side bottom -fill x -expand 1 -anchor s -padx 10
+
+ # Set window attributes
+ wm iconphoto $win ::ICONS::16::configure
+ wm transient $win .
+ wm title $win [mc "Configure terminal emulator"]
+ wm minsize $win 380 280
+ raise $win
+ catch {grab $win}
+ wm protocol $win WM_DELETE_WINDOW {
+ ::configDialogues::terminal::CANCEL
+ }
+ tkwait window $win
+ }
+
+ ## Valiadte content of font size spinbox
+ # @pamr String content - String to valiadte
+ # @return void
+ proc font_size_valiade {content} {
+ if {$content == {}} {
+ return 1
+ }
+ if {![string is digit $content]} {
+ return 0
+ }
+ if {$content > 22} {
+ return 0
+ }
+ after idle {
+ ::configDialogues::terminal::font_changed
+ }
+ return 1
+ }
+
+ ## Change font for example text
+ # @return void
+ proc font_changed {} {
+ variable configuration ;# Array: Configuration array
+ variable example_text ;# Widget: Label widget containing example text
+ variable selected_font ;# Font: Current font
+ variable changed ;# Bool: Settings changed
+
+ if {$configuration(font_size) == {} || $configuration(font_size) < 4} {
+ return
+ }
+
+ font delete $selected_font
+ set selected_font [font create \
+ -family $configuration(font_family) \
+ -size -$configuration(font_size) \
+ ]
+ $example_text configure -font $selected_font
+ set changed 1
+ }
+
+ ## Select color
+ # @parm String what_clr - What color (foreground / background ...)
+ # @parm String var - Key in configuration array
+ # @parm Widget button - Source button
+ # @return void
+ proc select_color {what_clr var button} {
+ variable configuration ;# Array: Configuration array
+ variable win ;# ID of toplevel dialog window
+ variable changed ;# Bool: Settings changed
+
+ switch -- $what_clr {
+ {foreground} {
+ set txt [mc "Select foreground color"]
+ }
+ {background} {
+ set txt [mc "Select background color"]
+ }
+ }
+
+ set color [SelectColor .select_color \
+ -parent $win \
+ -color $configuration($var) \
+ -title $txt \
+ ]
+
+ # Set new content of the given variable and button background color
+ if {$color != {}} {
+ set configuration($var) $color
+ $button configure -bg $color -activebackground $color
+
+ # Adjust status changed
+ set changed 1
+ }
+ }
+
+ ## Retrieve settings from main NS
+ # @return void
+ proc getSettings {} {
+ variable configuration ;# Array: Configuration array
+ array set configuration [array get ::Terminal::configuration]
+ }
+
+ ## Set application according to local settings
+ # @return void
+ proc use_settings {} {
+ variable configuration ;# Array: Configuration array
+ if {$configuration(font_size) == {} || $configuration(font_size) < 4} {
+ set configuration(font_size) 13
+ }
+ array set ::Terminal::configuration [array get configuration]
+ }
+
+ ## Save settings to the config file
+ # @return void
+ proc save_config {} {
+ variable configuration ;# Array: Configuration array
+
+ foreach key [array names configuration] {
+ ::settings setValue "Terminal emulator/$key" $::Terminal::configuration($key)
+ }
+
+ ::settings saveConfig
+ }
+
+ ## Load configuration from config file
+ # @return void
+ proc load_config {} {
+ # Load configuration
+ array set default_conf ${::Terminal::configuration_def}
+ foreach key [array names ::Terminal::configuration] {
+ set ::Terminal::configuration($key) [::settings getValue \
+ "Terminal emulator/$key" $default_conf($key) \
+ ]
+ }
+
+ # Validate configuration
+ if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(bg)}]} {
+ puts stderr [mc "Invalid value of key: '%s'" {bg}]
+ set ::Terminal::configuration(bg) {#FFFFFF}
+ }
+ if {![regexp {^#[0-9a-fA-F]{6,12}$} ${::Terminal::configuration(fg)}]} {
+ puts stderr [mc "Invalid value of key: '%s'" {fg}]
+ set ::Terminal::configuration(fg) {#000000}
+ }
+ if {
+ ![regexp {^\d+$} ${::Terminal::configuration(font_size)}]
+ ||
+ ${::Terminal::configuration(font_size)} < 4
+ ||
+ ${::Terminal::configuration(font_size)} > 22
+ } then {
+ puts stderr [mc "Invalid value of key: '%s'" {font_size}]
+ set ::Terminal::configuration(font_size) 13
+ }
+ if {![string length [string trim ${::Terminal::configuration(font_family)}]]} {
+ puts stderr [mc "Invalid value of key: '%s'" {font_family}]
+ set ::Terminal::configuration(font_family) $::DEFAULT_FIXED_FONT
+ }
+ }
+
+ ## Resart terminal emulators for all projects
+ # @return void
+ proc RESTART {} {
+ use_settings
+ foreach project ${::X::openedProjects} {
+ $project terminal_restart
+ }
+ }
+
+ ## Destroy the dialog
+ # @return void
+ proc CANCEL {} {
+ variable win ;# ID of toplevel dialog window
+ variable dialog_opened ;# Bool: True if this dialog is already opened
+
+ # Destroy dialog window
+ set dialog_opened 0
+ grab release $win
+ destroy $win
+ }
+
+ ## Use settings and destroy the dialog
+ # @return void
+ proc OK {} {
+ variable win ;# ID of toplevel dialog window
+ variable changed ;# Bool: Settings changed
+
+ # Use and save settings
+ if {$changed} {
+ use_settings
+ save_config
+ }
+
+ # Destroy dialog window
+ CANCEL
+ }
+
+ ## Restrore defaults
+ # @return void
+ proc DEFAULTS {} {
+ variable configuration ;# Array: Configuration array
+ variable fg_clr_but ;# Widget: Button for selecting foreground color
+ variable bg_clr_but ;# Widget: Button for selecting background color
+
+ array set configuration ${::Terminal::configuration_def}
+ $fg_clr_but configure \
+ -bg $configuration(fg) \
+ -activebackground $configuration(fg)
+ $bg_clr_but configure \
+ -bg $configuration(bg) \
+ -activebackground $configuration(bg)
+ }
+}
+
+# >>> File inclusion guard
+}
+# <<< File inclusion guard