Use checkboxes to assemble UNIX rights as string and octal values.
/*
* Copyright (c) 2002, 2003, 2009 Jochen Kupperschmidt
* Released under the terms of the MIT License
* _ _
* | |_ ___ _____ ___ _ _ _ ___ ___| |_
* | | . | | ._| | | | . | _| . /
* |_|_|___|_|_|_|___|_____|___|_| |_|_\
* http://homework.nwsnet.de/
*
* The user is presented a window with checkboxes that allows to select UNIX
* file permissions for user/group/others and displays the respective string
* and octal value representations.
*
* It began as an exercise to gain more experience with Java and Swing
* programming, but might also prove useful to people learning UNIX-like
* operating systems or in need of a dialog to graphically change file
* permissions, e.g. for creating an FTP client.
*
* This is the Groovy remake (27-Dec-2009) of the original Java application
* (20-Mar-2003). It makes extensive use of Groovy features (implicit getters
* and setters, closures, the asterisk operator, maps as constructor arguments,
* SwingBuilder) and thus requires significantly less code.
*/
import groovy.swing.SwingBuilder
import java.awt.BorderLayout
import java.awt.Font
import java.awt.GridLayout
import javax.swing.JCheckBox
import javax.swing.JFrame
import javax.swing.JLabel
import javax.swing.JPanel
/**
* A representation of UNIX file permissions (read, write, execute).
*/
class Permissions {
def final chars = ['x', 'w', 'r']
def flags = new BitSet(chars.size())
def assemble(Closure closure, notSetValue) {
(0..<chars.size()).collect {flags[it] ? closure(it) : notSetValue}.sum()
}
def getStringValue() {
assemble({chars[it]}, '-').reverse()
}
def getOctalValue() {
assemble({1 << it}, 0) as int
}
}
/**
* A panel with checkboxes to select UNIX file permissions.
*/
class PermissionsPanel extends JPanel {
def permissions = new Permissions()
def PermissionsPanel(Closure actionHandler) {
layout = new GridLayout(0, 1)
[2: 'Read', 1: 'Write', 0: 'Execute'].each {i, label ->
def checkbox = new JCheckBox(focusPainted: false, text: label)
checkbox.actionPerformed = {
// Update permissions from checkbox state.
permissions.flags[i] = checkbox.selected
actionHandler()
}
add(checkbox)
}
}
}
def List<PermissionsPanel> permissionsPanels = []
def displayLabels = []
def updatePermissionsDisplay = {
// Update string and octal representations.
displayLabels[0].text = permissionsPanels*.permissions*.stringValue.join('')
displayLabels[1].text = permissionsPanels*.permissions*.octalValue.join('')
println displayLabels*.text.join(' ')
}
def swing = new SwingBuilder()
swing.lookAndFeel('gtk')
swing.frame(defaultCloseOperation: JFrame.EXIT_ON_CLOSE,
locationRelativeTo: null, pack: true, resizable: false, show: true,
title: 'Unix Rights Helper') {
panel(border: emptyBorder(4)) {
borderLayout()
// Create permission selection panels.
panel(constraints: BorderLayout.CENTER) {
gridLayout(cols: 0, rows: 1)
['User', 'Group', 'Others'].each {title ->
def permissionsPanel = new PermissionsPanel(updatePermissionsDisplay)
permissionsPanel.border = titledBorder(title)
widget(permissionsPanel)
permissionsPanels << permissionsPanel
}
}
// Create permission representation panels.
panel(constraints: BorderLayout.SOUTH) {
gridLayout(cols: 0, rows: 1)
['String', 'Octal'].each {title ->
panel(border: titledBorder(title)) {
def displayLabel = label(font: new Font('Monospaced', Font.PLAIN, 12),
horizontalAlignment: JLabel.CENTER)
widget(displayLabel)
displayLabels << displayLabel
}
}
}
}
// Initialize display permissions.
updatePermissionsDisplay()
}