/*
 *  Licensed to the Apache Software Foundation (ASF) under one
 *  or more contributor license agreements.  See the NOTICE file
 *  distributed with this work for additional information
 *  regarding copyright ownership.  The ASF licenses this file
 *  to you under the Apache License, Version 2.0 (the
 *  "License"); you may not use this file except in compliance
 *  with the License.  You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing,
 *  software distributed under the License is distributed on an
 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *  KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations
 *  under the License.
 */
package swing

import static java.awt.BorderLayout.*
import static javax.swing.JSplitPane.VERTICAL_SPLIT
import static javax.swing.WindowConstants.EXIT_ON_CLOSE

frame(title: 'The Groovy Regex Coach', location: [20, 40], size: [600, 500], defaultCloseOperation: EXIT_ON_CLOSE) {
    panel {
        borderLayout()
        splitPane(orientation: VERTICAL_SPLIT, dividerLocation: 150) {
            panel {
                borderLayout()
                label(constraints: NORTH, text: 'Regular expression:')
                scrollPane(constraints: CENTER) {
                    textPane(id: 'regexPane')
                }
                label(constraints: SOUTH, id: 'regexStatus', text: ' ')
            }
            panel {
                borderLayout()
                label(constraints: NORTH, text: 'Target string:')
                scrollPane(constraints: CENTER) {
                    textPane(id: 'targetPane')
                }
                panel(constraints: SOUTH) {
                    borderLayout()
                    label(constraints: NORTH, id: 'targetStatus', text: ' ')
                    panel(constraints: SOUTH) {
                        flowLayout()
                        button('<<-', id: 'scanLeft')
                        button('->>', id: 'scanRight')
                    }
                }
            }
        }
    }
}