/*
* File : EditorPanel.java
* Created : 05-jun-2002 10:30
* By : fbusquets
*
* JClic - Authoring and playing system for educational activities
*
* Copyright (C) 2000 - 2005 Francesc Busquets & Departament
* d'Educacio de la Generalitat de Catalunya
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details (see the LICENSE file).
*/
package edu.xtec.jclic.edit;
import edu.xtec.jclic.edit.Editor.EditorListener;
import edu.xtec.util.CtrlPanel;
import edu.xtec.util.Options;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.Icon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.border.EmptyBorder;
/**
* This class is a {@link edu.xtec.util.CtrlPanel} specialized to deal with
* {@link edu.xtec.jclic.edit.Editor} objects. Every implementation of editor panel
* will have specific methods to deal with a specific type of <CODE>Editor</CODE>
* objects (wich, in turn, will be designed for a specific type of data objects).
* @author Francesc Busquets (fbusquets@xtec.cat)
* @version 1.0
*/
public abstract class EditorPanel extends CtrlPanel implements FocusListener, EditorListener{
protected Editor editor;
protected Options options;
public static final Color titleBgColor=Color.orange;
public static final Color titleForeColor=Color.blue;
public static final Color panelBgColor=new Color(255, 255, 204);
public static final Border titleBorder=new EmptyBorder(new Insets(6, 4, 6, 4));
public static final Border panelBorder=new EmptyBorder(0,0,0,0);
public JLabel northComponent;
public Component southComponent;
/** Creates new EditPanel */
public EditorPanel(Options options){
super();
this.options=options;
}
public Options getOptions(){
return options;
}
protected void postInit(int preferredLabelWidth, boolean withTitleBar, boolean withToolBar){
setBorder(panelBorder);
if(withTitleBar || withToolBar){
JPanel northPanel=new JPanel(new BorderLayout());
if(withTitleBar){
northComponent=createTitleLabel(preferredLabelWidth);
northPanel.add(northComponent, BorderLayout.NORTH);
}
if(withToolBar){
southComponent=createToolBar();
northPanel.add(southComponent, BorderLayout.SOUTH);
}
add(northPanel, BorderLayout.NORTH);
}
}
public abstract boolean checkIfEditorValid(Editor e);
// to disappear:
public final void clear(){
setModified(false);
}
public final void fill(){
setInitializing(true);
fillData();
setInitializing(false);
setModified(false);
setEnabled(editor!=null);
}
protected abstract void fillData();
public final void save(){
if(editor!=null && isModified()){
saveData();
editor.fireEditorDataChanged(this);
setModified(false);
}
}
protected abstract void saveData();
public void attachEditor(Editor e, boolean saveChanges){
if(e==editor){
if(editor!=null && saveChanges && isModified())
editor.setModified(true);
fill();
}
else{
if(editor!=null)
removeEditor(saveChanges);
if(checkIfEditorValid(e)){
setEditor(e);
editor.addEditorListener(this);
fill();
}
}
}
public Editor getEditor(){
return editor;
}
protected synchronized void setEditor(Editor e){
if(editor!=null)
editor.clearActionsOwner();
editor=e;
if(e!=null)
e.setActionsOwner();
}
public void removeEditor(boolean saveChanges){
if(editor!=null){
editor.removeEditorListener(this);
if(saveChanges)
save();
setEditor(null);
fill();
}
}
public void editorDataChanged(Editor e){
if(e!=null && e.equals(getEditor()))
fillData();
}
protected Icon getIcon(){
return null;
}
protected String getTitle(){
return "";
}
protected JLabel createTitleLabel(int preferredWidth){
JLabel result=new JLabel(getTitle());
result.setHorizontalAlignment(SwingConstants.CENTER);
if(getIcon()!=null){
result.setIcon(getIcon());
result.setIconTextGap(10);
}
result.setBackground(titleBgColor);
result.setForeground(titleForeColor);
result.setOpaque(true);
result.setBorder(titleBorder);
result.validate();
Dimension d=result.getPreferredSize();
result.setPreferredSize(new Dimension(Math.max(d.width, preferredWidth), d.height));
result.setMinimumSize(result.getPreferredSize());
return result;
}
protected void addActionsTo(Container cnt){
}
protected JToolBar createToolBar(){
JToolBar toolBar=new JToolBar();
toolBar.setFloatable(false);
toolBar.setOpaque(false);
addActionsTo(toolBar);
return toolBar;
}
protected String checkEmptyString(String src, boolean trim, String msgCodeDefault){
String result=src;
if(result!=null && trim)
result=result.trim();
if(result==null || result.length()==0)
result=options.getMsg(msgCodeDefault);
return result;
}
public boolean showDialog(Editor e, String titleKey, Component cmp,
boolean removeActionButtons){
if(removeActionButtons && southComponent!=null)
remove(southComponent);
attachEditor(e, false);
EditDialog dlg=new EditDialog(options, titleKey, JOptionPane.getFrameForComponent(cmp));
dlg.getContentPane().add(this, BorderLayout.CENTER);
if(northComponent!=null){
Dimension d=dlg.getContentPane().getPreferredSize();
d.width=northComponent.getPreferredSize().width;
setPreferredSize(d);
}
dlg.showDialog();
removeEditor(dlg.result);
return dlg.result;
}
public void focusGained(FocusEvent focusEvent) {
if(getEditor()!=null)
getEditor().setActionsOwner();
else
Editor.clearBasicActionsOwner();
}
public void focusLost(FocusEvent focusEvent) {
// do nothing!
}
}