Java tutorial
// Description: Java 8 JavaFX Attribute Pane implementation for Scope. /* * CFBam * * Copyright (c) 2014-2016 Mark Sobkow * * This program is available as free software under the GNU GPL v3, or * under a commercial license from Mark Sobkow. For commercial licensing * details, please contact msobkow@sasktel.net. * * Under the terms of the GPL: * * 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 3 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. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package net.sourceforge.msscodefactory.cfbam.v2_7.CFBamJavaFX; import java.math.*; import java.sql.*; import java.text.*; import java.util.*; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; import javafx.scene.control.Control; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.Priority; import net.sourceforge.msscodefactory.cflib.v2_7.CFLib.*; import net.sourceforge.msscodefactory.cflib.v2_7.CFLib.JavaFX.*; import net.sourceforge.msscodefactory.cflib.v2_7.CFLib.JavaFX.CFReferenceEditor.ICFReferenceCallback; import org.apache.commons.codec.binary.Base64; import net.sourceforge.msscodefactory.cfsecurity.v2_7.CFSecurity.*; import net.sourceforge.msscodefactory.cfinternet.v2_7.CFInternet.*; import net.sourceforge.msscodefactory.cfbam.v2_7.CFBam.*; import net.sourceforge.msscodefactory.cfsecurity.v2_7.CFSecurityObj.*; import net.sourceforge.msscodefactory.cfinternet.v2_7.CFInternetObj.*; import net.sourceforge.msscodefactory.cfbam.v2_7.CFBamObj.*; import net.sourceforge.msscodefactory.cfsecurity.v2_7.CFSecurityJavaFX.*; import net.sourceforge.msscodefactory.cfinternet.v2_7.CFInternetJavaFX.*; /** * CFBamJavaFXScopeAttrPane JavaFX Attribute Pane implementation * for Scope. */ public class CFBamJavaFXScopeAttrPane extends CFGridPane implements ICFBamJavaFXScopePaneCommon { protected ICFFormManager cfFormManager = null; protected ICFBamJavaFXSchema javafxSchema = null; boolean javafxIsInitializing = true; protected class IdCFLabel extends CFLabel { public IdCFLabel() { super(); setText("Id"); } } protected class IdEditor extends CFInt64Editor { public IdEditor() { super(); setMinValue(CFBamScopeBuff.ID_MIN_VALUE); setFieldName("Id"); } } protected IdCFLabel javafxLabelId = null; protected IdEditor javafxEditorId = null; public CFBamJavaFXScopeAttrPane(ICFFormManager formManager, ICFBamJavaFXSchema argSchema, ICFBamScopeObj argFocus) { super(); Control ctrl; CFLabel label; CFReferenceEditor reference; final String S_ProcName = "construct-schema-focus"; if (formManager == null) { throw CFLib.getDefaultExceptionFactory().newNullArgumentException(getClass(), S_ProcName, 1, "formManager"); } cfFormManager = formManager; if (argSchema == null) { throw CFLib.getDefaultExceptionFactory().newNullArgumentException(getClass(), S_ProcName, 2, "argSchema"); } // argFocus is optional; focus may be set later during execution as // conditions of the runtime change. javafxSchema = argSchema; setJavaFXFocusAsScope(argFocus); setPadding(new Insets(5)); setHgap(5); setVgap(5); setAlignment(Pos.CENTER); ColumnConstraints column1 = new ColumnConstraints(125); ColumnConstraints column2 = new ColumnConstraints(125, 300, 500); column2.setHgrow(Priority.ALWAYS); getColumnConstraints().addAll(column1, column2); int gridRow = 0; label = getJavaFXLabelId(); setHalignment(label, HPos.LEFT); add(label, 0, gridRow); ctrl = getJavaFXEditorId(); setHalignment(ctrl, HPos.LEFT); add(ctrl, 1, gridRow); gridRow++; populateFields(); adjustComponentEnableStates(); javafxIsInitializing = false; } public ICFFormManager getCFFormManager() { return (cfFormManager); } public void setCFFormManager(ICFFormManager value) { final String S_ProcName = "setCFFormManager"; if (value == null) { throw CFLib.getDefaultExceptionFactory().newNullArgumentException(getClass(), S_ProcName, 1, "value"); } cfFormManager = value; } public ICFBamJavaFXSchema getJavaFXSchema() { return (javafxSchema); } public void setJavaFXFocus(ICFLibAnyObj value) { final String S_ProcName = "setJavaFXFocus"; if ((value == null) || (value instanceof ICFBamScopeObj)) { super.setJavaFXFocus(value); } else { throw CFLib.getDefaultExceptionFactory().newUnsupportedClassException(getClass(), S_ProcName, "value", value, "ICFBamScopeObj"); } populateFields(); adjustComponentEnableStates(); } public ICFBamScopeObj getJavaFXFocusAsScope() { return ((ICFBamScopeObj) getJavaFXFocus()); } public void setJavaFXFocusAsScope(ICFBamScopeObj value) { setJavaFXFocus(value); } public IdCFLabel getJavaFXLabelId() { if (javafxLabelId == null) { javafxLabelId = new IdCFLabel(); } return (javafxLabelId); } public void setJavaFXLabelId(IdCFLabel value) { javafxLabelId = value; } public IdEditor getJavaFXEditorId() { if (javafxEditorId == null) { javafxEditorId = new IdEditor(); } return (javafxEditorId); } public void setJavaFXEditorId(IdEditor value) { javafxEditorId = value; } public void populateFields() { ICFBamScopeObj popObj; ICFBamScopeObj focus = getJavaFXFocusAsScope(); if (focus != null) { popObj = (ICFBamScopeObj) (focus.getEdit()); if (popObj == null) { popObj = focus; } } else { popObj = null; } if (getPaneMode() == CFPane.PaneMode.Unknown) { popObj = null; } if (popObj == null) { getJavaFXEditorId().setInt64Value(null); } else { getJavaFXEditorId().setInt64Value(popObj.getRequiredId()); } } public void postFields() { final String S_ProcName = "postFields"; ICFBamScopeObj focus = getJavaFXFocusAsScope(); ICFBamScopeEditObj editObj; if (focus != null) { editObj = (ICFBamScopeEditObj) (focus.getEdit()); } else { editObj = null; } if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Pane is unfocused or is not editing the focus object"); } } public void setPaneMode(CFPane.PaneMode value) { final String S_ProcName = "setPaneMode"; CFPane.PaneMode oldValue = getPaneMode(); if (oldValue == value) { return; } ICFBamScopeObj focus = getJavaFXFocusAsScope(); if ((value != CFPane.PaneMode.Unknown) && (value != CFPane.PaneMode.View)) { if (focus == null) { throw CFLib.getDefaultExceptionFactory().newNullArgumentException(getClass(), S_ProcName, 0, "javaFXFocus"); } } ICFBamScopeEditObj editObj; if (focus != null) { editObj = (ICFBamScopeEditObj) focus.getEdit(); } else { editObj = null; } switch (value) { case Unknown: switch (oldValue) { case Unknown: break; default: if (editObj != null) { editObj.endEdit(); } break; } break; case Add: switch (oldValue) { case Unknown: case Add: case View: if (editObj == null) { if (focus != null) { if (!focus.getIsNew()) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Transitioning to PaneMode Add requires Focus.getIsNew() to be true"); } editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } else { throw CFLib.getDefaultExceptionFactory().newNullArgumentException(getClass(), S_ProcName, 0, "focus"); } } break; case Edit: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode Edit to Add"); case Update: if ((editObj == null) || (!editObj.getIsNew())) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode Update to Add"); } break; case Delete: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode Delete to Add"); default: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode default to Add"); } break; case View: switch (oldValue) { case Unknown: break; case View: break; case Edit: break; case Update: break; case Delete: break; default: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode " + oldValue + " to View"); } if (editObj != null) { editObj.endEdit(); } break; case Edit: switch (oldValue) { case Unknown: if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } break; case View: if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } break; case Edit: if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } break; case Update: if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode " + oldValue + " to Edit"); } break; default: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode " + oldValue + " to Edit"); } break; case Update: if ((oldValue != CFPane.PaneMode.Edit) && (oldValue != CFPane.PaneMode.Add)) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition from mode " + oldValue + " to Update"); } super.setPaneMode(value); if (editObj != null) { postFields(); if (editObj.getIsNew()) { focus = (ICFBamScopeObj) editObj.create(); setJavaFXFocus(focus); } else { editObj.update(); } editObj.endEdit(); editObj = null; } setPaneMode(CFPane.PaneMode.View); break; case Delete: switch (oldValue) { case View: if (focus != null) { if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } } break; case Edit: if (focus != null) { if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } } break; case Update: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode Update to Delete"); case Delete: if (editObj == null) { editObj = (ICFBamScopeEditObj) focus.beginEdit(); if (editObj == null) { throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Expected beginEdit() to return a new edition of the focus object"); } } break; default: throw CFLib.getDefaultExceptionFactory().newUsageException(getClass(), S_ProcName, "Cannot transition PaneMode " + oldValue + " to Delete"); } editObj.delete(); editObj.endEdit(); setJavaFXFocus(null); setPaneMode(CFPane.PaneMode.Unknown); break; default: switch (oldValue) { case Unknown: break; default: if (editObj != null) { editObj.endEdit(); } break; } break; } super.setPaneMode(value); populateFields(); adjustComponentEnableStates(); } public void adjustComponentEnableStates() { CFPane.PaneMode mode = getPaneMode(); boolean isEditing; switch (mode) { case Unknown: case View: case Delete: isEditing = false; break; case Add: case Edit: case Update: isEditing = true; break; default: isEditing = false; break; } if (isEditing) { ICFBamScopeObj focus = getJavaFXFocusAsScope(); if (focus == null) { isEditing = false; } else if (null == focus.getEdit()) { isEditing = false; } } if (javafxEditorId != null) { javafxEditorId.setDisable(true); } } }