/*******************************************************************************
* Copyright (c) 2010 Stefan A. Tzeggai.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v2.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* Stefan A. Tzeggai - initial API and implementation
******************************************************************************/
package org.geopublishing.geopublisher.chartwizard;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import java.util.Locale;
import javax.swing.BorderFactory;
import javax.swing.JDialog;
import net.miginfocom.swing.MigLayout;
import org.apache.log4j.Logger;
import org.geopublishing.geopublisher.swing.GeopublisherGUI;
import org.geotools.data.FeatureSource;
import org.netbeans.spi.wizard.WizardPage;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import de.schmitzm.geotools.data.amd.AttributeMetadataMap;
import de.schmitzm.i18n.I18NUtil;
import de.schmitzm.i18n.Translation;
import de.schmitzm.jfree.JFreeChartUtil;
import de.schmitzm.jfree.chart.style.ChartType;
import de.schmitzm.swing.TranslationEditJPanel;
/**
* This {@link WizardPage} allows to define Title and Description/sub-title of
* the chart in form of {@link TranslationEditJPanel}s
*
* @author Stefan A. Tzeggai
*/
public class ChartTitleDescriptionWizardPanel extends WizardPage {
private static final String validationTitleFailedMsg = GeopublisherGUI
.R("ChartWizardPanel.titleAndDescription.ValidationError.Title");
final static Logger LOGGER = Logger
.getLogger(ChartTitleDescriptionWizardPanel.class);
/* The short description label that appears on the left side of the wizard */
static String desc = GeopublisherGUI.R("ChartWizardPanel.titleAndDescription");
TranslationEditJPanel titleTranslationEditPanel;
TranslationEditJPanel descTranslationEditPanel;
private ChartType chartType;
private void initGUI() {
setLayout(new MigLayout("wrap 1"));
add(getTitleTranslationEditPanel(), "sgx");
add(getDescTranslationEditPanel(), "sgx");
}
public TranslationEditJPanel getTitleTranslationEditPanel() {
if (titleTranslationEditPanel == null) {
Translation translation = (Translation) getWizardData(ChartWizard.TITLE);
if (translation == null) {
// Create a default translation for which describes roughly what
// is shown
translation = new Translation();
final String resourceKey = ChartType.class.getSimpleName()
+ "_" + chartType.toString() + ".Title";
// TODO This doesn't work :-( I need martins help.
for (final String lang : getLanguages()) {
final Locale locale = new Locale(lang);
final String chartTypetitle = JFreeChartUtil.RESOURCE
.getString(resourceKey, locale);
translation.put(lang, chartTypetitle);
}
}
titleTranslationEditPanel = new TranslationEditJPanel(translation,
getLanguages());
titleTranslationEditPanel.setName(ChartWizard.TITLE);
}
titleTranslationEditPanel.setBorder(BorderFactory
.createTitledBorder(GeopublisherGUI
.R("ManageChartsForMapDialog.ColumnName.2")));
return titleTranslationEditPanel;
}
@SuppressWarnings("unchecked")
private List<String> getLanguages() {
final List<String> wizardDataLanguages = (List<String>) getWizardData(ChartWizard.LANGUAGES);
return wizardDataLanguages;
}
/**
* Not cached any more...
*/
public TranslationEditJPanel getDescTranslationEditPanel() {
Translation translation = null;
if (translation == null) {
// Create a default translation which describes roughly what
// is shown.
translation = new Translation();
final AttributeMetadataMap amdm = (AttributeMetadataMap) getWizardData(ChartWizard.ATTRIBUTEMETADATAMAP);
final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource = (FeatureSource<SimpleFeatureType, SimpleFeature>) getWizardData(ChartWizard.FEATURESOURCE);
final String domainAttribName = (String) getWizardData(ChartWizard.ATTRIBUTE_
+ "0");
// final Translation domainTitleTranslation = ASUtil
// .getAttributeMetadataFor(amdm, domainAttribName)
// .getTitle();
final Translation domainTitleTranslation = amdm.get(domainAttribName).getTitle();
final Translation[] seriesTitleTranslations = new Translation[100];
for (int i = 1; i < chartType.getMaxDimensions()
|| chartType.getMaxDimensions() < 0; i++) {
final String seriesAttribName = (String) getWizardData(ChartWizard.ATTRIBUTE_
+ i);
if (seriesAttribName == null)
break;
// seriesTitleTranslations[i - 1] = ASUtil
// .getAttributeMetadataFor(amdm, seriesAttribName)
// .getTitle();
seriesTitleTranslations[i - 1] = amdm.get(seriesAttribName).getTitle();
}
for (final String lang : getLanguages()) {
final String domainTitle = domainTitleTranslation.get(lang) != null ? domainTitleTranslation
.get(lang)
: domainAttribName;
String descTranslated = domainTitle + " ";
String firstSeriesTitle = null;
if (seriesTitleTranslations[0] != null) {
firstSeriesTitle = seriesTitleTranslations[0]
.get(lang) != null ? seriesTitleTranslations[0]
.get(lang)
: (String) getWizardData(ChartWizard.ATTRIBUTE_ + 1);
if (chartType == ChartType.SCATTER) {
descTranslated += "vs. " + firstSeriesTitle; // i8n
} // else später
}
for (int i = 1; i < chartType.getMaxDimensions()
|| chartType.getMaxDimensions() < 0; i++) {
if (seriesTitleTranslations[i] == null)
break;
final String attribTitle = seriesTitleTranslations[i]
.get(lang) != null ? seriesTitleTranslations[i]
.get(lang)
: (String) getWizardData(ChartWizard.ATTRIBUTE_
+ (i + 1));
descTranslated += ", " + attribTitle;
}
if (chartType == ChartType.BAR) {
if (firstSeriesTitle != null)
descTranslated = GeopublisherGUI.R("ChartWizardPanel.DefaultBarChartSubTitle",firstSeriesTitle,descTranslated);
} // scatter früher
translation.put(lang, descTranslated);
}
}
descTranslationEditPanel = new TranslationEditJPanel(translation,
getLanguages());
descTranslationEditPanel.setName(ChartWizard.DESC);
// }
descTranslationEditPanel.setBorder(BorderFactory
.createTitledBorder(GeopublisherGUI
.R("ManageChartsForMapDialog.ColumnName.3")));
return descTranslationEditPanel;
}
@Override
protected void renderingPage() {
chartType = (ChartType) getWizardData(ChartWizard.CHARTTYPE);
removeAll();
initGUI();
}
public static String getDescription() {
return desc;
}
@Override
protected String validateContents(final Component component,
final Object event) {
if (I18NUtil.isEmpty(titleTranslationEditPanel.getTranslation()))
return validationTitleFailedMsg;
// if (I8NUtil.isEmpty(descTranslationEditPanel.getTranslation()))
// return "Desc empty!"; // i8n
return null;
}
@Override
protected CustomComponentListener createCustomComponentListener() {
return new CCL();
}
private static final class CCL extends CustomComponentListener implements
ActionListener {
private CustomComponentNotifier notifier;
@Override
public boolean accept(final Component c) {
return c instanceof TranslationEditJPanel;
}
@Override
public void startListeningTo(final Component c,
final CustomComponentNotifier n) {
notifier = n;
((TranslationEditJPanel) c).addTranslationChangeListener(this);
}
@Override
public void stopListeningTo(final Component c) {
((TranslationEditJPanel) c).removeTranslationChangeListener(this);
}
@Override
public Object valueFor(final Component c) {
return ((TranslationEditJPanel) c).getTranslation();
}
public void actionPerformed(final ActionEvent e) {
notifier.userInputReceived((Component) e.getSource(), e);
}
}
public static void main(final String[] args) {
final JDialog d = new JDialog();
d.setContentPane(new ChartTitleDescriptionWizardPanel());
d.pack();
d.setVisible(true);
}
}