Skip to content
Snippets Groups Projects
prefdialog.rb 10.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • require 'fox16'
    
    include Fox
    
    class PrefDialog < FXDialogBox
      # Load the named icon from a file
      def loadIcon(filename)
        begin
          filename = File.join("..", "icons", filename)
          icon = nil
          File.open(filename, "rb") { |f|
            icon = FXPNGIcon.new(getApp(), f.read)
          }
          icon
        rescue
          raise RuntimeError, "Couldn't load icon: #{filename}"
        end
      end
    
      def initialize(owner)
        super(owner, "TextEdit Preferences", DECOR_TITLE|DECOR_BORDER|DECOR_RESIZE,
          0, 0, 0, 0, 0, 0, 0, 0, 4, 4)
    
        vertical = FXVerticalFrame.new(self,
          LAYOUT_SIDE_TOP|LAYOUT_FILL_X|LAYOUT_FILL_Y)
        horizontal = FXHorizontalFrame.new(vertical, LAYOUT_FILL_X|LAYOUT_FILL_Y)
        buttons = FXVerticalFrame.new(horizontal, (LAYOUT_LEFT|LAYOUT_FILL_Y|
          FRAME_SUNKEN|PACK_UNIFORM_WIDTH|PACK_UNIFORM_HEIGHT))
        buttons.padLeft = 0
        buttons.padRight = 0
        buttons.padTop = 0
        buttons.padBottom = 0
        switcher = FXSwitcher.new(horizontal, LAYOUT_FILL_X|LAYOUT_FILL_Y)
    
        # Icons
        pal = loadIcon("palette.png")
        ind = loadIcon("indent.png")
        pat = loadIcon("pattern.png")
        del = loadIcon("delimit.png")
    
        # Pane 1
        pane1 = FXVerticalFrame.new(switcher, LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXLabel.new(pane1, "Color settings", nil, LAYOUT_LEFT)
        FXHorizontalSeparator.new(pane1, SEPARATOR_LINE|LAYOUT_FILL_X)
        matrix1 = FXMatrix.new(pane1, 5,
          MATRIX_BY_ROWS|PACK_UNIFORM_HEIGHT|LAYOUT_FILL_X|LAYOUT_FILL_Y)
    
        FXLabel.new(matrix1, "Background:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Text:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Sel. text background:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Sel. text:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Cursor:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
    
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_TEXT_BACK,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_TEXT_FORE,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_TEXT_SELBACK,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_TEXT_SELFORE,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_TEXT_CURSOR,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
    
        FXLabel.new(matrix1, "Files background:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Files:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Sel. files background:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Sel. files:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix1, "Lines:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
    
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_DIR_BACK,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_DIR_FORE,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_DIR_SELBACK,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_DIR_SELFORE,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
        FXColorWell.new(matrix1, FXRGB(0, 0, 0), owner, TextWindow::ID_DIR_LINES,
          (COLORWELL_OPAQUEONLY|FRAME_SUNKEN|FRAME_THICK|LAYOUT_LEFT|
           LAYOUT_CENTER_Y|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT|LAYOUT_FILL_COLUMN|
           LAYOUT_FILL_ROW), 0, 0, 40, 24)
    
        # Button 1
        FXButton.new(buttons, "Colors\tChange Colors\tChange text colors.", pal,
          switcher, FXSwitcher::ID_OPEN_FIRST, (FRAME_RAISED|ICON_ABOVE_TEXT|
          LAYOUT_FILL_Y))
    
        # Pane 2
        pane2 = FXVerticalFrame.new(switcher, LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXLabel.new(pane2, "Editor settings", nil, LAYOUT_LEFT)
        FXHorizontalSeparator.new(pane2, SEPARATOR_LINE|LAYOUT_FILL_X)
        matrix2 = FXMatrix.new(pane2, 5, (MATRIX_BY_ROWS|PACK_UNIFORM_HEIGHT|
          LAYOUT_FILL_X|LAYOUT_FILL_Y))
    
        FXLabel.new(matrix2, "Word wrapping:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Auto indent:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Fixed wrap margin:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Strip carriage returns:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Insert tab characters:", nil, (JUSTIFY_LEFT|
          LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
    
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_TOGGLE_WRAP,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_AUTOINDENT,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_FIXED_WRAP,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_STRIP_CR,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_INSERTTABS,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
    
        FXLabel.new(matrix2, "Wrap margin:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Tab columns:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Brace match time (us):", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Strip trailing spaces:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
        FXLabel.new(matrix2, "Mouse wheel lines:", nil,
          JUSTIFY_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_X|LAYOUT_FILL_ROW)
    
        FXTextField.new(matrix2, 4, owner, TextWindow::ID_WRAPCOLUMNS,
          (JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_LEFT|
           LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
        FXTextField.new(matrix2, 4, owner, TextWindow::ID_TABCOLUMNS,
          (JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_LEFT|
           LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
        FXTextField.new(matrix2, 4, owner, TextWindow::ID_BRACEMATCH,
          (JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_LEFT|
           LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
        FXCheckButton.new(matrix2, nil, owner, TextWindow::ID_STRIP_SP,
          LAYOUT_LEFT|LAYOUT_CENTER_Y|LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW,
          0, 0, 0, 0, 0, 0, 0, 0)
        spinner = FXSpinner.new(matrix2, 2, owner, TextWindow::ID_WHEELADJUST,
          (JUSTIFY_RIGHT|FRAME_SUNKEN|FRAME_THICK|LAYOUT_CENTER_Y|LAYOUT_LEFT|
           LAYOUT_FILL_COLUMN|LAYOUT_FILL_ROW))
        spinner.range = 1..100
    
        # Button 2
        FXButton.new(buttons,
          "Editor\tEditor settings\tChange editor settings and other things.", ind,
          switcher, FXSwitcher::ID_OPEN_SECOND,
          FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y)
    
        # Pane 3
        pane3 = FXVerticalFrame.new(switcher, LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXLabel.new(pane3, "File Patterns", nil, LAYOUT_LEFT)
        FXHorizontalSeparator.new(pane3, SEPARATOR_LINE|LAYOUT_FILL_X)
        sub3 = FXVerticalFrame.new(pane3, LAYOUT_FILL_Y|LAYOUT_FILL_X)
        FXLabel.new(sub3,
          'Filename patterns, for example "Source Files (*.c,*.h)", one per line:',
          nil, JUSTIFY_LEFT)
        textwell = FXVerticalFrame.new(sub3,
          LAYOUT_FILL_X|LAYOUT_FILL_Y|FRAME_SUNKEN|FRAME_THICK,
          0, 0, 0, 0, 0, 0, 0, 0)
        @text = FXText.new(textwell, nil, 0, LAYOUT_FILL_X|LAYOUT_FILL_Y)
    
        # Button 3
        FXButton.new(buttons,
          "Patterns\tFilename patterns\tChange wildcard patterns for filenames.",
          pat, switcher, FXSwitcher::ID_OPEN_THIRD,
          FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y)
    
        # Pane 4
        pane4 = FXVerticalFrame.new(switcher, LAYOUT_FILL_X|LAYOUT_FILL_Y)
        FXLabel.new(pane4, "Word Delimiters", nil, LAYOUT_LEFT)
        FXHorizontalSeparator.new(pane4, SEPARATOR_LINE|LAYOUT_FILL_X)
        sub4 = FXVerticalFrame.new(pane4, LAYOUT_FILL_Y|LAYOUT_FILL_X)
        FXLabel.new(sub4, "Characters delimiting words:", nil, JUSTIFY_LEFT)
        FXTextField.new(sub4, 20, owner, TextWindow::ID_DELIMITERS,
          FRAME_SUNKEN|FRAME_THICK|LAYOUT_FILL_X)
    
        # Button 4
        FXButton.new(buttons,
          "Delimiters\tWord delimiters\tChange delimiters for word selections.",
          del, switcher, FXSwitcher::ID_OPEN_FOURTH,
          FRAME_RAISED|ICON_ABOVE_TEXT|LAYOUT_FILL_Y)
    
        # Bottom part
        FXHorizontalSeparator.new(vertical, SEPARATOR_RIDGE|LAYOUT_FILL_X)
        closebox = FXHorizontalFrame.new(vertical,
          LAYOUT_BOTTOM|LAYOUT_FILL_X|PACK_UNIFORM_WIDTH)
        FXButton.new(closebox, "&Accept", nil, self, FXDialogBox::ID_ACCEPT,
          LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20)
        FXButton.new(closebox, "&Cancel", nil, self, FXDialogBox::ID_CANCEL,
          LAYOUT_RIGHT|FRAME_RAISED|FRAME_THICK, 0, 0, 0, 0, 20, 20)
      end
    
    
      # Change patterns, each pattern separated by newline
      def setPatterns(patterns)
        @text.text = patterns.join("\n")
      end
    
      # Return array of patterns
      def getPatterns
        @text.text.split("\n")
      end
    end