Project: Cinch
//   Copyright 2011 Palantir Technologies
// 
//   Licensed 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 com.palantir.ptoss.cinch.example; 
 
import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.lang.reflect.InvocationTargetException; 
 
import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
 
import com.google.common.base.Strings; 
import com.palantir.ptoss.cinch.core.Bindable; 
import com.palantir.ptoss.cinch.core.Bindings; 
import com.palantir.ptoss.cinch.core.DefaultBindableModel; 
import com.palantir.ptoss.cinch.swing.Action; 
import com.palantir.ptoss.cinch.swing.Bound; 
import com.palantir.ptoss.cinch.swing.EnabledIf; 
 
public class IntroCinchMVC { 
 
    public static class IntroModel extends DefaultBindableModel { 
        private String to = ""
        private String subject = ""
        private String body = ""
 
        public String getBody() { 
            return body; 
        } 
 
        public void setBody(String body) { 
            this.body = body; 
            update(); 
        } 
 
        public String getSubject() { 
            return subject; 
        } 
 
        public void setSubject(String subject) { 
            this.subject = subject; 
            update(); 
        } 
 
        public String getTo() { 
            return to; 
        } 
 
        public void setTo(String to) { 
            this.to = to; 
            update(); 
        } 
 
        public String getCurrentMessage() { 
            if (Strings.isNullOrEmpty(to)) { 
                return "Fill out 'To' field."
            } 
            if (Strings.isNullOrEmpty(subject)) { 
                return "Fill out 'Subject' field."
            } 
            if (Strings.isNullOrEmpty(body)) { 
                return "Fill out 'Body'."
            } 
            return "Ready to send."
        } 
 
        public boolean isReady() { 
            return !Strings.isNullOrEmpty(to) && !Strings.isNullOrEmpty(subject) && !Strings.isNullOrEmpty(body); 
        } 
 
        @Override 
        public String toString() { 
            return "IntroModel [to=" + to + ", subject=" + subject + ", body=" + body + "]"
        } 
    } 
 
    public static class IntroController { 
        private final IntroModel model; 
 
        public IntroController(IntroModel model) { 
            this.model = model; 
        } 
 
        public void sendEmail() { 
            System.out.println("Send: " + model); 
        } 
 
        public void yell() { 
            model.setBody(model.getBody().toUpperCase()); 
        } 
    } 
 
    private final JPanel panel = new JPanel(); 
 
    private final Bindings bindings = new Bindings(); 
 
    private final IntroModel model = new IntroModel(); 
 
    @SuppressWarnings("unused"
    @Bindable 
    private final IntroController controller = new IntroController(model); 
 
    @Bound(to = "to"
    private final JTextField toField = new JTextField(); 
 
    @Bound(to = "subject"
    private final JTextField subjectField = new JTextField(); 
 
    @Bound(to = "body"
    private final JTextArea bodyArea = new JTextArea(); 
 
    @Action(call = "yell"
    private final JButton yellButton = new JButton("YELL!"); 
 
    @Action(call = "sendEmail"
    @EnabledIf(to = "ready"
    private final JButton sendButton = new JButton("Send"); 
 
 
    @Bound(to = "currentMessage"
    private final JLabel messageLabel = new JLabel(""); 
 
    public IntroCinchMVC() { 
        initializeInterface(); 
        bindings.bind(this); 
    } 
 
    private void initializeInterface() { 
        JPanel toPanel = new JPanel(new BorderLayout()); 
        toPanel.add(new JLabel("To"), BorderLayout.NORTH); 
        toPanel.add(toField, BorderLayout.CENTER); 
        toPanel.setBorder(BorderFactory.createEmptyBorder(0050)); 
 
        JPanel subjectPanel = new JPanel(new BorderLayout()); 
        subjectPanel.add(new JLabel("Subject"), BorderLayout.NORTH); 
        subjectPanel.add(subjectField, BorderLayout.CENTER); 
        subjectPanel.setBorder(BorderFactory.createEmptyBorder(0050)); 
 
        JPanel bodyPanel = new JPanel(new BorderLayout()); 
        bodyPanel.add(new JLabel("Body"), BorderLayout.NORTH); 
        bodyPanel.add(new JScrollPane(bodyArea), BorderLayout.CENTER); 
        bodyPanel.setBorder(BorderFactory.createEmptyBorder(0050)); 
 
        JPanel topPanel = new JPanel(new BorderLayout()); 
        topPanel.add(toPanel, BorderLayout.NORTH); 
        topPanel.add(subjectPanel, BorderLayout.SOUTH); 
 
        JPanel bottomPanel = new JPanel(new BorderLayout()); 
        bottomPanel.add(messageLabel, BorderLayout.WEST); 
        JPanel buttonPanel = new JPanel(); 
        buttonPanel.add(yellButton); 
        buttonPanel.add(sendButton); 
        bottomPanel.add(buttonPanel, BorderLayout.EAST); 
 
        bodyArea.setPreferredSize(new Dimension(400200)); 
 
        panel.setLayout(new BorderLayout()); 
        panel.add(topPanel, BorderLayout.NORTH); 
        panel.add(bodyPanel, BorderLayout.CENTER); 
        panel.add(bottomPanel, BorderLayout.SOUTH); 
 
        panel.setBorder(BorderFactory.createEmptyBorder(10101010)); 
    } 
 
    public JComponent getDisplayComponent() { 
        return panel; 
    } 
 
    public static void main(String[] args) throws InterruptedException, InvocationTargetException { 
        EventQueue.invokeAndWait(new Runnable() { 
            public void run() { 
                IntroCinchMVC example = new IntroCinchMVC(); 
                JFrame frame = Examples.getFrameFor("Cinch Email Example", example.panel); 
                frame.pack(); 
                frame.setVisible(true); 
            } 
        }); 
    } 
}