// 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(0, 0, 5, 0));
JPanel subjectPanel = new JPanel(new BorderLayout());
subjectPanel.add(new JLabel("Subject"), BorderLayout.NORTH);
subjectPanel.add(subjectField, BorderLayout.CENTER);
subjectPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
JPanel bodyPanel = new JPanel(new BorderLayout());
bodyPanel.add(new JLabel("Body"), BorderLayout.NORTH);
bodyPanel.add(new JScrollPane(bodyArea), BorderLayout.CENTER);
bodyPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 5, 0));
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(400, 200));
panel.setLayout(new BorderLayout());
panel.add(topPanel, BorderLayout.NORTH);
panel.add(bodyPanel, BorderLayout.CENTER);
panel.add(bottomPanel, BorderLayout.SOUTH);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
}
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);
}
});
}
}