content: /**
   * Copyright 2020 Alexander Herzog
   *
   * 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 ui.modeleditor.elements;
  
  import java.awt.BorderLayout;
  import java.awt.Color;
  import java.awt.Component;
  import java.awt.FlowLayout;
  import java.io.Serializable;
  
  import javax.swing.Box;
  import javax.swing.BoxLayout;
  import javax.swing.JCheckBox;
  import javax.swing.JComboBox;
  import javax.swing.JComponent;
  import javax.swing.JPanel;
  import javax.swing.JScrollPane;
  import javax.swing.JTabbedPane;
  import javax.swing.JTextField;
  
  import language.Language;
  import mathtools.NumberTools;
  import systemtools.LabeledAlphaButton;
  import systemtools.LabeledColorChooserButton;
  import systemtools.MsgBox;
  import systemtools.OptionalColorChooserButton;
  import tools.JTableExt;
  import ui.images.Images;
  import ui.infopanel.InfoPanel;
  import ui.modeleditor.ModelElementBaseDialog;
  
  /**
   * Dialog, der Einstellungen fr ein {@link ModelElementAnimationTextSelect}-Element anbietet
   * @author Alexander Herzog
   * @see ModelElementAnimationTextSelect
   */
  public class ModelElementAnimationTextSelectDialog extends ModelElementBaseDialog {
  	/**
  	 * Serialisierungs-ID der Klasse
  	 * @see Serializable
  	 */
  	private static final long serialVersionUID = 5107663089458560385L;
  
  	/** Tabelle zur Definition der mglichen Bedingungen und Ausgaben */
  	private ExpressionTableModelText expressionTableModel;
  	/** Eingabefeld fr den Standardtext, der angezeigt werden soll, wenn keine der Bedingungen zutrifft */
  	private JTextField defaultTextEdit;
  	/** Auswahlfeld fr die Schriftart */
  	private JComboBox<FontCache.FontFamily> fontFamilyComboBox;
  	/** Eingabefeld fr die Schriftgre */
  	private JTextField sizeField;
  	/** Option: Text in Fettdruck darstellen */
  	private JCheckBox optionBold;
  	/** Option: Text kursiv darstellen */
  	private JCheckBox optionItalic;
  	/** Option: HTML- und LaTeX-Symbole interpretieren */
  	private JCheckBox optionInterpretSymbols;
  	/** Auswahl der Farbe fr den Text */
  	private LabeledColorChooserButton colorChooser;
  	/** Auswahl der Hintergrundfarbe */
  	private OptionalColorChooserButton colorChooserBackground;
  	/** Schieberegler zur Auswahl des Deckkraft der Hintergrundfarbe */
  	private LabeledAlphaButton alpha;
  	/** Auswahl der Schattenfarbe */
  	private OptionalColorChooserButton colorChooserShadow;
  	/** Schieberegler zur Auswahl des Deckkraft des Schattens */
  	private LabeledAlphaButton shadowAlpha;
  
  	/**
  	 * Konstruktor der Klasse
  	 * @param owner	bergeordnetes Fenster
  	 * @param element	Zu bearbeitendes {@link ModelElementAnimationTextSelect}
  	 * @param readOnly	Nur-Lese-Status
  	 */
  	public ModelElementAnimationTextSelectDialog(final Component owner, final ModelElementAnimationTextSelect element, final ModelElementBaseDialog.ReadOnlyMode readOnly) {
  		super(owner,Language.tr("Surface.AnimationTextSelect.Dialog.Title"),element,"ModelElementAnimationTextSelect",readOnly);
  	}
  
  	/**
  	 * Stellt die Gre des Dialogfensters ein.
  	 */
  	@Override
  	protected void setDialogSize() {
  		setMinSizeRespectingScreensize(800,600);
  		setResizable(true);
  		pack();
  		setMaxSizeRespectingScreensize(1024,768);
  	}
  
  	/**
  	 * Stellt die Gre des Dialogfensters unmittelbar vor dem Sicherbarmachen ein.
  	 */
  	@Override
  	protected void setDialogSizeLater() {
  	}
  
  	@Override
  	protected String getInfoPanelID() {
  		return InfoPanel.stationAnimationTextSelect;
  	}
  
  	@SuppressWarnings("unchecked")
  	@Override
  	protected JComponent getContentPanel() {
  		final JTabbedPane tabs=new JTabbedPane();
  
  		JPanel tabOuter, tab, line;
  		Object[] data;
  
  		/* Tab "Ausdrcke" */
  		final JTableExt expressionTable;
  		tabs.add(Language.tr("Surface.AnimationTextSelect.Dialog.Tabs.Expression"),tab=new JPanel(new BorderLayout()));
  		tab.add(new JScrollPane(expressionTable=new JTableExt()),BorderLayout.CENTER);
  		if (element instanceof ModelElementAnimationTextSelect) {
  			expressionTable.setModel(expressionTableModel=new ExpressionTableModelText(expressionTable,(ModelElementAnimationTextSelect)element,readOnly,helpRunnable));
  		}
  		expressionTable.getColumnModel().getColumn(0).setMaxWidth(200);
  		expressionTable.getColumnModel().getColumn(0).setMinWidth(200);
  		expressionTable.setIsPanelCellTable(0);
  		expressionTable.setIsPanelCellTable(1);
  		expressionTable.setEnabled(!readOnly);
  
  		/* Standardtext */
  		data=getInputPanel(Language.tr("Surface.AnimationTextSelect.Dialog.DefaultValue")+":","");
  		defaultTextEdit=(JTextField)data[1];
  		defaultTextEdit.setEnabled(!readOnly);
  		tab.add((JPanel)data[0],BorderLayout.SOUTH);
  
  		/* Tab "Darstellung" */
  		tabs.add(Language.tr("Surface.AnimationTextSelect.Dialog.Tabs.Appearance"),tabOuter=new JPanel(new BorderLayout()));
  		tabOuter.add(tab=new JPanel(),BorderLayout.NORTH);
  		tab.setLayout(new BoxLayout(tab,BoxLayout.PAGE_AXIS));
  
  		/* Schriftart */
  		data=getFontFamilyComboBoxPanel(Language.tr("Surface.AnimationTextSelect.Dialog.FontFamily")+":",((ModelElementAnimationTextSelect)element).getFontFamily());
  		fontFamilyComboBox=(JComboBox<FontCache.FontFamily>)data[1];
  		fontFamilyComboBox.setEnabled(!readOnly);
  		tab.add((JPanel)data[0]);
  
  		/* Schriftgre */
  		data=getInputPanel(Language.tr("Surface.AnimationText.Dialog.FontSize")+":","",5);
  		sizeField=(JTextField)data[1];
  		sizeField.setEnabled(!readOnly);
  		tab.add((JPanel)data[0]);
  		sizeField.addActionListener(e->NumberTools.getNotNegativeInteger(sizeField,true));
  
  		/* Fett / Kursiv */
  		tab.add(line=new JPanel(new FlowLayout(FlowLayout.LEFT)));
  		line.add(optionBold=new JCheckBox("<html><b>"+Language.tr("Surface.AnimationText.Dialog.FontSize.Bold")+"</b></html>",false));
  		optionBold.setEnabled(!readOnly);
  		line.add(optionItalic=new JCheckBox("<html><i>"+Language.tr("Surface.AnimationText.Dialog.FontSize.Italic")+"</i></html>",false));
  		optionItalic.setEnabled(!readOnly);
  
  		/* Interpretation von Symbolen */
  		line.add(optionInterpretSymbols=new JCheckBox(Language.tr("Surface.AnimationText.Dialog.FontSize.HTMLLaTeX"),false));
  		optionInterpretSymbols.setToolTipText(Language.tr("Surface.AnimationText.Dialog.FontSize.HTMLLaTeX.Info"));
  		optionInterpretSymbols.setEnabled(!readOnly);
  
  		/* Zeile fr Farben 1 */
  		tab.add(line=new JPanel(new FlowLayout(FlowLayout.LEFT)));
  
  		/* Schriftfarbe */
  		line.add(colorChooser=new LabeledColorChooserButton(Language.tr("Surface.AnimationText.Dialog.Color")+":",Color.BLACK));
  		colorChooser.setEnabled(!readOnly);
  
  		/* Zeile fr Farben 2 */
  		tab.add(line=new JPanel(new FlowLayout(FlowLayout.LEFT)));
  
  		/* Hintergrundfarbe */
  		line.add(colorChooserBackground=new OptionalColorChooserButton(Language.tr("Surface.AnimationText.Dialog.FillBackground"),null,Color.BLACK));
  		colorChooserBackground.setEnabled(!readOnly);
  
  		line.add(Box.createHorizontalStrut(10));
  
  		/* Deckkraft */
  		line.add(alpha=new LabeledAlphaButton(Language.tr("Surface.AnimationText.Dialog.Alpha")+":",0));
  		alpha.setEnabled(!readOnly);
  
  		/* Zeile fr Farben 3 */
  		tab.add(line=new JPanel(new FlowLayout(FlowLayout.LEFT)));
  
  		/* Schattenfarbe */
  		line.add(colorChooserShadow=new OptionalColorChooserButton(Language.tr("Surface.Text.AnimationText.ShadowColor")+":",null,Color.GRAY));
  		colorChooserShadow.setEnabled(!readOnly);
  
  		line.add(Box.createHorizontalStrut(10));
  
  		/* Strke des Schatten */
  		line.add(shadowAlpha=new LabeledAlphaButton(Language.tr("Surface.Text.AnimationText.ShadowAlpha")+":",1));
  		shadowAlpha.setEnabled(!readOnly);
  
  		/* Werte initialisieren */
  		if (element instanceof ModelElementAnimationTextSelect) {
  			final ModelElementAnimationTextSelect text=(ModelElementAnimationTextSelect)element;
  			defaultTextEdit.setText(text.getDefaultText());
  			sizeField.setText(""+text.getTextSize());
  			optionBold.setSelected(text.getTextBold());
  			optionItalic.setSelected(text.getTextItalic());
  			optionInterpretSymbols.setSelected(text.isInterpretSymbols());
  			colorChooser.setColor(text.getColor());
  			colorChooserBackground.setColor(text.getFillColor());
  			alpha.setAlpha(text.getFillAlpha());
  			colorChooserShadow.setColor(text.getShadowColor());
  			if (text.getShadowColor()!=null) shadowAlpha.setAlpha(text.getShadowAlpha());
  		}
  
  		alpha.addClickListener(e->colorChooserBackground.setActive(true));
  		shadowAlpha.addClickListener(e->colorChooserShadow.setActive(true));
  
  		/* Icons fr Tabs */
  		tabs.setIconAt(0,Images.MODE_EXPRESSION.getIcon());
  		tabs.setIconAt(1,Images.MODELEDITOR_ELEMENT_PROPERTIES_APPEARANCE.getIcon());
  
  		return tabs;
  	}
  
  	/**
  	 * Prft, ob die eingegebenen Daten in Ordnung sind.
  	 * @param showErrorMessages	Wird hier <code>true</code> bergeben, so wird eine Fehlermeldung ausgegeben, wenn die Daten nicht in Ordnung sind.
  	 * @return	Gibt <code>true</code> zurck, wenn die Daten in Ordnung sind.
  	 */
  	private boolean checkData(final boolean showErrorMessages) {
  		if (readOnly) return false;
  
  		boolean ok=true;
  
  		Integer I=NumberTools.getNotNegativeInteger(sizeField,true);
  		if (I==null) {
  			ok=false;
  			if (showErrorMessages) {
  				MsgBox.error(this,Language.tr("Surface.AnimationTextSelect.Dialog.FontSize.Error.Title"),Language.tr("Surface.AnimationTextSelect.Dialog.FontSize.Error.Info"));
  				return false;
  			}
  		}
  
  		return ok;
  	}
  
  	/**
  	 * Wird beim Klicken auf "Ok" aufgerufen, um zu prfen, ob die Daten in der aktuellen Form
  	 * in Ordnung sind und gespeichert werden knnen.
  	 * @return	Gibt <code>true</code> zurck, wenn die Daten in Ordnung sind.
  	 */
  	@Override
  	protected boolean checkData() {
  		return checkData(true);
  	}
  
  	/**
  	 * Speichert die Dialog-Daten in dem zugehrigen Daten-Objekt.<br>
  	 * (Diese Routine wird beim Klicken auf "Ok" nach <code>checkData</code> aufgerufen.
  	 * @see #checkData()
  	 */
  	@Override
  	protected void storeData() {
  		super.storeData();
  
  		if (!(element instanceof ModelElementAnimationTextSelect)) return;
  		final ModelElementAnimationTextSelect text=(ModelElementAnimationTextSelect)element;
  		/* Bedingte Ausdrcke */
  		expressionTableModel.storeData((ModelElementAnimationTextSelect)element);
  
  		/* Standardtext */
  		text.setDefaultText(defaultTextEdit.getText());
  
  		/* Schriftart */
  		text.setFontFamily((FontCache.FontFamily)fontFamilyComboBox.getSelectedItem());
  
  		/* Schriftgre */
  		final Integer I=NumberTools.getNotNegativeInteger(sizeField,true);
  		if (I!=null) text.setTextSize(I);
  
  		/* Fett/Kursiv */
  		text.setTextBold(optionBold.isSelected());
  		text.setTextItalic(optionItalic.isSelected());
  
  		/* Interpretation von Symbolen */
  		text.setInterpretSymbols(optionInterpretSymbols.isSelected());
  
  		/* Schriftfarbe */
  		text.setColor(colorChooser.getColor());
  
  		/* Hintergrundfarbe */
  		text.setFillColor(colorChooserBackground.getColor());
  
  		/* Deckkraft */
  		text.setFillAlpha(alpha.getAlpha());
  
  		/* Schattenfarbe */
  		text.setShadowColor(colorChooserShadow.getColor());
  
  		/* Deckkraft des Schattens */
  		text.setShadowAlpha(shadowAlpha.getAlpha());
  	}
  }