/*
* Copyright 2002-2010 the original author or authors.
*
* 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 org.jdal.swing;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Frame;
import java.io.Serializable;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JPanel;
import org.apache.commons.lang.StringUtils;
import org.jdal.dao.Dao;
import org.jdal.service.PersistentServiceAware;
import org.jdal.swing.action.DialogAcceptAction;
import org.jdal.swing.action.ViewAction;
import org.jdal.swing.action.ViewCancelAction;
import org.jdal.ui.Editor;
import org.jdal.ui.EditorEvent;
import org.jdal.ui.EditorListener;
import org.jdal.ui.bind.ControlChangeListener;
import org.springframework.validation.BindingResult;
/**
* A JDialog for use as View Wrapper
*
* @author Jose Luis Martin - (jlm@joseluismartin.info)
*/
public class ViewDialog<T> extends JDialog implements View<T>, Editor<T> {
public static final int OK = 0;
public static final int CANCEL= 1;
private static final long serialVersionUID = 1L;
private View<T> view;
private ViewAction<T> acceptAction = new DialogAcceptAction<T>();
private ViewAction<T> cancelAction = new ViewCancelAction<T>();
private JButton acceptButton;
private JButton cancelButton;
private int windowWidth = 750;
private int windowHeight = 750;
private int value = CANCEL;
private Dao<T, ?extends Serializable> persistentService;
private ArrayList<EditorListener> editorListeners = new ArrayList<EditorListener>();
public ViewDialog() {
this(null);
}
/**
* @param owner
*/
public ViewDialog(Frame owner) {
super(owner);
acceptAction.setDialog(this);
cancelAction.setDialog(this);
}
public void init() {
if (view == null)
return;
acceptAction.setView(view);
cancelAction.setView(view);
add(view.getPanel(), BorderLayout.CENTER);
if (view.getModel() != null && StringUtils.isEmpty(getTitle()))
setTitle(view.getModel().toString());
add(createButtonBox(), BorderLayout.SOUTH);
setSize(windowWidth, windowHeight);
setLocationRelativeTo(null);
}
protected Component createButtonBox() {
acceptButton = new JButton(acceptAction);
cancelButton = new JButton(cancelAction);
JPanel p = new JPanel();
p.add(acceptButton);
p.add(cancelButton);
return p;
}
public View<T> getView() {
return view;
}
public void setView(View<T> view) {
this.view = view;
}
public ViewAction<T> getAcceptAction() {
return acceptAction;
}
public void setAcceptAction(ViewAction<T> acceptAction) {
this.acceptAction = acceptAction;
this.acceptAction.setView(view);
this.acceptAction.setDialog(this);
}
public ViewAction<T> getCancelAction() {
return cancelAction;
}
public void setCancelAction(ViewAction<T> cancelAction) {
this.cancelAction = cancelAction;
cancelAction.setView(view);
cancelAction.setDialog(this);
}
public boolean isAccepted() {
return value == OK;
}
/**
* @return the value
*/
public int getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(int value) {
this.value = value;
}
/**
* @return the dialogWidth
* @deprecated use getWindowWidth
*/
@Deprecated
public int getDialogWidth() {
return windowWidth;
}
/**
* @param dialogWidth the dialogWidth to set
* @deprecated use setWindowWidth
*/
@Deprecated
public void setDialogWidth(int dialogWidth) {
this.windowWidth = dialogWidth;
}
/**
* @return the dialogHeight
* @deprecated use getWindowHeight
*/
@Deprecated
public int getDialogHeight() {
return windowHeight;
}
/**
* @param dialogHeight the dialogHeight to set
* @deprecated use setWindoHeigth
*/
@Deprecated
public void setDialogHeight(int dialogHeight) {
this.windowHeight = dialogHeight;
}
public void clear() {
view.clear();
}
public T getModel() {
return view.getModel();
}
public JComponent getPanel() {
return view.getPanel();
}
public void refresh() {
if (view.getModel() != null)
setTitle(view.getModel().toString());
view.refresh();
}
public void setModel(T model) {
view.setModel(model);
}
public void update() {
view.update();
}
public boolean validateView() {
return view.validateView();
}
/**
* {@inheritDoc}
*/
public boolean isDirty() {
return false;
}
/**
* {@inheritDoc}
*/
public void enableView(boolean enabled) {
view.enableView(enabled);
acceptButton.setEnabled(enabled);
}
/**
* {@inheritDoc}
*/
public BindingResult getBindingResult() {
return view.getBindingResult();
}
/**
* {@inheritDoc}
*/
public String getErrorMessage() {
return view.getErrorMessage();
}
/**
* {@inheritDoc}
*/
public void addControlChangeListener(ControlChangeListener listener) {
view.addControlChangeListener(listener);
}
/**
* {@inheritDoc}
*/
public void removeControlChangeListener(ControlChangeListener listener) {
view.removeControlChangeListener(listener);
}
/**
* {@inheritDoc}
*/
@SuppressWarnings("unchecked")
public void setPersistentService(Dao<T, ? extends Serializable> persistentService) {
if (this.acceptAction instanceof PersistentServiceAware)
((PersistentServiceAware<T>) acceptAction).setPersistentService(persistentService);
this.persistentService = persistentService;
}
/**
* {@inheritDoc}
*/
public void addEditorListener(EditorListener listener) {
if (!editorListeners.contains(listener))
editorListeners.add(listener);
}
/**
* {@inheritDoc}
*/
public void save() {
// persistentService.save(view.getModel());
fireModelChanged();
}
/**
* Notify editor listeners that model changed
*/
private void fireModelChanged() {
EditorEvent event = new EditorEvent(this, getModel());
for (EditorListener listener : editorListeners) {
listener.modelChanged(event);
}
}
/**
* {@inheritDoc}
*/
public void removeEditorListener(EditorListener listener) {
editorListeners.remove(listener);
}
/**
* @return the windwoWidth
*/
public int getWindwoWidth() {
return windowWidth;
}
/**
* @param windwoWidth the windwoWidth to set
*/
public void setWindwoWidth(int windwoWidth) {
this.windowWidth = windwoWidth;
}
/**
* @return the windowHeight
*/
public int getWindowHeight() {
return windowHeight;
}
/**
* @param windowHeight the windowHeight to set
*/
public void setWindowHeight(int windowHeight) {
this.windowHeight = windowHeight;
}
/**
* @return the windowWidth
*/
public int getWindowWidth() {
return windowWidth;
}
/**
* @param windowWidth the windowWidth to set
*/
public void setWindowWidth(int windowWidth) {
this.windowWidth = windowWidth;
}
/**
* {@inheritDoc}
*/
public void cancel() {
}
}