From 69f82291cd349961cca5d8a65b7f3f2f724ed74f Mon Sep 17 00:00:00 2001 From: tkellner Date: Wed, 10 Apr 2013 18:53:20 +0000 Subject: StateMachine cleanup JumpToState stuff git-svn-id: https://joinup.ec.europa.eu/svn/pdf-over/trunk@24 174cde9d-5d70-4d2a-aa98-46368bc2aaf7 --- .../at/asit/pdfover/gui/MainWindowBehavior.java | 3 + .../gui/composites/BKUSelectionComposite.java | 164 ++++++++++++ .../gui/composites/DataSourceSelectComposite.java | 293 +++++++++++++++++++++ .../gui/composites/PositioningComposite.java | 117 ++++++++ .../pdfover/gui/composites/StateComposite.java | 49 ++++ .../pdfover/gui/composites/WaitingComposite.java | 72 +++++ .../at/asit/pdfover/gui/workflow/GUIProvider.java | 5 +- .../at/asit/pdfover/gui/workflow/StateMachine.java | 2 +- .../pdfover/gui/workflow/StateMachineImpl.java | 57 +--- .../java/at/asit/pdfover/gui/workflow/Status.java | 6 + .../at/asit/pdfover/gui/workflow/StatusImpl.java | 28 +- .../gui/workflow/states/BKUSelectionState.java | 27 +- .../pdfover/gui/workflow/states/LocalBKUState.java | 8 + .../gui/workflow/states/MobileBKUState.java | 8 + .../pdfover/gui/workflow/states/OpenState.java | 34 ++- .../pdfover/gui/workflow/states/OutputState.java | 10 +- .../gui/workflow/states/PositioningState.java | 26 +- .../workflow/states/PrepareConfigurationState.java | 8 + .../gui/workflow/states/PrepareSigningState.java | 61 ++++- .../pdfover/gui/workflow/states/SigningState.java | 10 +- .../at/asit/pdfover/gui/workflow/states/State.java | 6 +- 21 files changed, 918 insertions(+), 76 deletions(-) create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java create mode 100644 pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java (limited to 'pdf-over-gui') diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java index 63c2dafd..1d0094c9 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java @@ -28,6 +28,9 @@ public class MainWindowBehavior { protected Map buttonsActive; protected boolean mainBarVisible; + /** + * + */ public MainWindowBehavior() { this.buttonsActive = new EnumMap(MainWindow.Buttons.class); this.buttonsEnabled = new EnumMap( MainWindow.Buttons.class); diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java new file mode 100644 index 00000000..24be2c5a --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java @@ -0,0 +1,164 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.composites; + +// Imports +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.states.BKUSelectionState; +import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.gui.workflow.states.State; + +/** + * + */ +public class BKUSelectionComposite extends StateComposite { + + + /** + * Listener for local bku selection + */ + private final class LocalSelectionListener implements SelectionListener { + + /** + * Default constructor + */ + public LocalSelectionListener() { + // Nothing here + } + + @Override + public void widgetSelected(SelectionEvent e) { + log.debug("Setting BKU to LOCAL"); + setSelected(BKUs.LOCAL); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing here + } + } + + /** + * Listener for mobile bku selection + */ + private final class MobileSelectionListener implements SelectionListener { + + /** + * Default constructor + */ + public MobileSelectionListener() { + // Nothing here + } + + @Override + public void widgetSelected(SelectionEvent e) { + log.debug("Setting BKU to MOBILE"); + setSelected(BKUs.MOBILE); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing here + } + } + + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(BKUSelectionComposite.class); + + private BKUs selected = BKUs.NONE; + + /** + * Gets selected BKU type + * @return BKUS enum + */ + public BKUs getSelected() { + return this.selected; + } + + /** + * Sets selected BKU and updates workflow + * @param selected + */ + public void setSelected(final BKUs selected) { + this.selected = selected; + this.state.updateStateMachine(); + } + + /** + * Create the composite. + * @param parent + * @param style + * @param state + */ + public BKUSelectionComposite(Composite parent, int style, State state) { + super(parent, style, state); + + this.setLayout(new FormLayout()); + + + Button btn_mobile = new Button(this, SWT.NATIVE | SWT.RESIZE); + btn_mobile.setText("MOBILE"); + //Point mobile_size = btn_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT); + FormData fd_btn_mobile = new FormData(); + fd_btn_mobile.left = new FormAttachment(40, 0); + fd_btn_mobile.right = new FormAttachment(50, 0); + fd_btn_mobile.top = new FormAttachment(45, 0); + fd_btn_mobile.bottom = new FormAttachment(55, 0); + btn_mobile.setLayoutData(fd_btn_mobile); + btn_mobile.addSelectionListener(new MobileSelectionListener()); + + Button btn_card = new Button(this, SWT.NATIVE | SWT.RESIZE); + btn_card.setText("CARD"); + //Point card_size = btn_card.computeSize(SWT.DEFAULT, SWT.DEFAULT); + FormData fd_btn_card = new FormData(); + fd_btn_card.left = new FormAttachment(50, 0); + fd_btn_card.right = new FormAttachment(60, 0); + fd_btn_card.top = new FormAttachment(45, 0); + fd_btn_card.bottom = new FormAttachment(55, 0); + btn_card.setLayoutData(fd_btn_card); + btn_card.addSelectionListener(new LocalSelectionListener()); + + this.pack(); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.components.StateComposite#doLayout() + */ + @Override + public void doLayout() { + this.layout(true, true); + } + +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java new file mode 100644 index 00000000..44b2574b --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java @@ -0,0 +1,293 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.composites; + +// Imports +import java.io.File; + +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.swt.widgets.Label; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.FormAttachment; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.SWT; +import org.eclipse.swt.dnd.*; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; + +import at.asit.pdfover.gui.workflow.StateMachineImpl; +import at.asit.pdfover.gui.workflow.states.State; + +/** + * + * + */ +public class DataSourceSelectComposite extends StateComposite { + + /** + * + */ + private final class FileBrowseDialog implements SelectionListener { + /** + * + */ + public FileBrowseDialog() { + // Nothing to do here + } + + @Override + public void widgetSelected(SelectionEvent e) { + FileDialog dialog = new FileDialog(DataSourceSelectComposite.this.getShell(), SWT.OPEN); + dialog.setFilterExtensions(new String[] {"*.pdf"}); + dialog.setFilterNames(new String[] {"PDF Dateien"}); + String fileName = dialog.open(); + File file = null; + if (fileName != null) { + file = new File(fileName); + if(file.exists()) { + DataSourceSelectComposite.this.setSelected(file); + } + } + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do here + } + } + + /** + * SFL4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(DataSourceSelectComposite.class); + + /** + * Set this value through the setter method!! + */ + private File selected = null; + + /** + * Sets the selected file and calls update to the workflow + * @param selected + */ + protected void setSelected(File selected) { + this.selected = selected; + this.state.updateStateMachine(); + } + + /** + * Gets the selected file + * + * @return the selected file + */ + public File getSelected() { + return this.selected; + } + + /** + * Create the composite. + * + * @param parent + * @param style + * @param state + */ + public DataSourceSelectComposite(Composite parent, int style, State state) { + super(parent, style, state); + + + this.setLayout(new FormLayout()); + + Color back = new Color(Display.getCurrent(), 77, 190, 250); + + this.drop_area = new Composite(this, SWT.RESIZE | SWT.BORDER_DASH); + FormData fd_drop_area = new FormData(); + fd_drop_area.left = new FormAttachment(0, 0); + fd_drop_area.right = new FormAttachment(100, 0); + fd_drop_area.top = new FormAttachment(0, 0); + fd_drop_area.bottom = new FormAttachment(100, 0); + this.drop_area.setLayoutData(fd_drop_area); + this.drop_area.setLayout(new FormLayout()); + this.drop_area.setBackground(back); + + DropTarget dnd_target = new DropTarget(this.drop_area, DND.DROP_DEFAULT + | DND.DROP_COPY); + final FileTransfer fileTransfer = FileTransfer.getInstance(); + Transfer[] types = new Transfer[] { fileTransfer }; + dnd_target.setTransfer(types); + + dnd_target.addDropListener(new DropTargetListener() { + + @Override + public void dropAccept(DropTargetEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void drop(DropTargetEvent event) { + if (fileTransfer.isSupportedType(event.currentDataType)){ + String[] files = (String[])event.data; + if(files.length > 0) { + // Only taking first file ... + File file = new File(files[0]); + if(!file.exists()) + { + log.error("File: " + files[0] + " doesnot exists!"); + return; + } + DataSourceSelectComposite.this.setSelected(file); + } + } + } + + @Override + public void dragOver(DropTargetEvent event) { + // TODO Auto-generated method stub + + } + + @Override + public void dragOperationChanged(DropTargetEvent event) { + if (event.detail == DND.DROP_DEFAULT) { + if ((event.operations & DND.DROP_COPY) != 0) { + event.detail = DND.DROP_COPY; + } else { + event.detail = DND.DROP_NONE; + } + } + } + + @Override + public void dragLeave(DropTargetEvent event) { + // No need to do anything here... + } + + @Override + public void dragEnter(DropTargetEvent event) { + if (event.detail == DND.DROP_DEFAULT) { + if ((event.operations & DND.DROP_COPY) != 0) { + event.detail = DND.DROP_COPY; + } else { + event.detail = DND.DROP_NONE; + } + } + // Only drop one item! + if(event.dataTypes.length > 1) { + event.detail = DND.DROP_NONE; + return; + } + // will accept text but prefer to have files dropped + for (int i = 0; i < event.dataTypes.length; i++) { + if (fileTransfer.isSupportedType(event.dataTypes[i])) { + event.currentDataType = event.dataTypes[i]; + // files should only be copied + if (event.detail != DND.DROP_COPY) { + event.detail = DND.DROP_NONE; + } + break; + } + } + } + }); + + final Label lbl_drag = new Label(this.drop_area, SWT.NONE | SWT.RESIZE); + FormData fd_lbl_drag = new FormData(); + fd_lbl_drag.left = new FormAttachment(5, 5); + fd_lbl_drag.right = new FormAttachment(100, -5); + fd_lbl_drag.top = new FormAttachment(5, 5); + fd_lbl_drag.bottom = new FormAttachment(55, -5); + lbl_drag.setLayoutData(fd_lbl_drag); + FontData[] fD = lbl_drag.getFont().getFontData(); + fD[0].setHeight(18); + lbl_drag.setFont(new Font(Display.getCurrent(), fD[0])); + lbl_drag.setText("Drag and Drop"); + lbl_drag.setAlignment(SWT.CENTER); + lbl_drag.setBackground(back); + + Button btn_open = new Button(this.drop_area, SWT.NATIVE | SWT.RESIZE); + btn_open.setText("Choose file ..."); + Point size = btn_open.computeSize(SWT.DEFAULT, SWT.DEFAULT); + FormData fd_btn_open = new FormData(); + fd_btn_open.left = new FormAttachment(100, size.x * -1 - 10); + fd_btn_open.right = new FormAttachment(100, -5); + fd_btn_open.top = new FormAttachment(100, size.y * -1 - 10); + fd_btn_open.bottom = new FormAttachment(100, -5); + btn_open.setLayoutData(fd_btn_open); + btn_open.setBackground(back); + btn_open.addSelectionListener(new FileBrowseDialog()); + this.drop_area.pack(); + + /* + * Button btn = new Button(this, SWT.NATIVE); btn.setBounds(50, 20, 100, + * 50); btn.setText("Click Me"); btn.addSelectionListener(new + * SelectionListener() { + * + * @Override public void widgetSelected(SelectionEvent arg0) { + * DataSourceSelectComposite.this.setPress(true); + * DataSourceSelectComposite.this.workflow.update(); } + * + * @Override public void widgetDefaultSelected(SelectionEvent arg0) { // + * TODO Auto-generated method stub + * + * } }); + */ + } + + private boolean press = false; + + private Composite drop_area; + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /** + * @return the press + */ + public boolean isPress() { + return this.press; + } + + /** + * @param press + * the press to set + */ + public void setPress(boolean press) { + this.press = press; + } + + /* + * (non-Javadoc) + * + * @see at.asit.pdfover.gui.components.StateComposite#doLayout() + */ + @Override + public void doLayout() { + this.layout(true, true); + this.drop_area.layout(true, true); + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java new file mode 100644 index 00000000..d641af62 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java @@ -0,0 +1,117 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.composites; + +// Imports +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.events.SelectionListener; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.State; +import at.asit.pdfover.signator.SignaturePosition; + +/** + * + * + */ +public class PositioningComposite extends StateComposite { + + /** + * Selection listener when position was fixed + */ + private final class PositionSelectedListener implements SelectionListener { + + /** + * Default constructor + */ + public PositionSelectedListener() { + // Nothing to do + } + + @Override + public void widgetSelected(SelectionEvent e) { + // TODO: FIX to get real position + PositioningComposite.this.setPosition(new SignaturePosition()); // Setting auto position for testing + PositioningComposite.this.state.updateStateMachine(); + } + + @Override + public void widgetDefaultSelected(SelectionEvent e) { + // Nothing to do + } + } + + /** + * SFL4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(PositioningComposite.class); + + private SignaturePosition position = null; + + /** + * Gets the Position + * @return + */ + public SignaturePosition getPosition() { + return this.position; + } + + /** + * Sets the position + * @param position + */ + public void setPosition(SignaturePosition position) { + this.position = position; + } + + /** + * Create the composite. + * @param parent + * @param style + */ + public PositioningComposite(Composite parent, int style, State state) { + super(parent, style, state); + + + Label test = new Label(this, SWT.NATIVE); + test.setBounds(10, 20, 100, 30); + test.setText("POSITIONING ---- TODO!!"); + + Button btn_position = new Button(this, SWT.NATIVE | SWT.RESIZE); + btn_position.setBounds(10, 50, 100, 30); + btn_position.setText("FAKE Position"); + btn_position.addSelectionListener(new PositionSelectedListener()); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.components.StateComposite#doLayout() + */ + @Override + public void doLayout() { + this.layout(true, true); + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java new file mode 100644 index 00000000..0b21e3aa --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java @@ -0,0 +1,49 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.composites; + +// Imports +import org.eclipse.swt.widgets.Composite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import at.asit.pdfover.gui.workflow.states.State; + +/** + * Composite interface for workflow state gui implementations + */ +public abstract class StateComposite extends Composite { + + protected State state; + + /** + * The base class for state composites + * + * @param parent + * @param style + * @param state + */ + public StateComposite(Composite parent, int style, State state) { + super(parent, style); + this.state = state; + } + + /** + * Performs layout for all children in composite + * (SWT layout(...) only layouts children no grandchildren!) + */ + public abstract void doLayout(); +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java new file mode 100644 index 00000000..4101e924 --- /dev/null +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java @@ -0,0 +1,72 @@ +/* + * Copyright 2012 by A-SIT, Secure Information Technology Center Austria + * + * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by + * the European Commission - subsequent versions of the EUPL (the "Licence"); + * You may not use this work except in compliance with the Licence. + * You may obtain a copy of the Licence at: + * http://joinup.ec.europa.eu/software/page/eupl + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the Licence is distributed on an "AS IS" basis, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the Licence for the specific language governing permissions and + * limitations under the Licence. + */ +package at.asit.pdfover.gui.composites; + +// Imports +import org.eclipse.swt.widgets.Composite; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.eclipse.swt.widgets.ProgressBar; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.layout.FormData; +import org.eclipse.swt.layout.FormAttachment; + +import at.asit.pdfover.gui.workflow.StateMachineImpl; +import at.asit.pdfover.gui.workflow.states.State; + +/** + * + */ +public class WaitingComposite extends StateComposite { + /** + * SLF4J Logger instance + **/ + private static final Logger log = LoggerFactory + .getLogger(WaitingComposite.class); + + /** + * Create the composite. + * @param parent + * @param style + * @param state + */ + public WaitingComposite(Composite parent, int style, State state) { + super(parent, style, state); + setLayout(new FormLayout()); + + ProgressBar progressBar = new ProgressBar(this, SWT.HORIZONTAL | SWT.INDETERMINATE); + FormData fd_progressBar = new FormData(); + fd_progressBar.top = new FormAttachment(50, -15); + fd_progressBar.bottom = new FormAttachment(50, +15); + fd_progressBar.left = new FormAttachment(50, -100); + fd_progressBar.right = new FormAttachment(50, +100); + progressBar.setLayoutData(fd_progressBar); + } + + @Override + protected void checkSubclass() { + // Disable the check that prevents subclassing of SWT components + } + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.composites.StateComposite#doLayout() + */ + @Override + public void doLayout() { + // Nothing to do here + } +} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/GUIProvider.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/GUIProvider.java index 4e7955fd..ff31ad0d 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/GUIProvider.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/GUIProvider.java @@ -17,6 +17,8 @@ package at.asit.pdfover.gui.workflow; import org.eclipse.swt.widgets.Composite; +import at.asit.pdfover.gui.workflow.states.State; + /** * @@ -32,9 +34,10 @@ public interface GUIProvider { * Create a new Composite * @param compositeClass The class of the Composite to create * @param style the SWT style + * @param state the State this Composite belongs to * @return the new Composite */ - public T createComposite(Class compositeClass, int style); + public T createComposite(Class compositeClass, int style, State state); /** * Display the composite as top most in main window diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java index 1298bda8..c98d9895 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java @@ -69,7 +69,7 @@ public interface StateMachine { * Update state machine from other thread * Calls the next state within the main thread */ - public void InvokeUpdate(); + public void invokeUpdate(); /** * Exit state machine execution diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java index bb292c74..38c3d55d 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java @@ -16,21 +16,17 @@ package at.asit.pdfover.gui.workflow; //Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.lang.reflect.Constructor; + import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindow; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState; -import at.asit.pdfover.gui.workflow.states.OpenState; -import at.asit.pdfover.gui.workflow.states.PositioningState; import at.asit.pdfover.gui.workflow.states.PrepareConfigurationState; import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; /** * Workflow holds logical state of signing process and updates the current @@ -72,37 +68,8 @@ public class StateMachineImpl implements StateMachine, GUIProvider { */ @Override public void jumpToState(State state) { - if (this.status.getCurrentState() != state && state != null) { - this.status.setCurrentState(state); - - // TODO rewrite when Config is done ... - if (state instanceof PositioningState) { - // User jumps to positioning state ! - // restore possible default for bku selection / forget BKU - // selection - this.getStatus().setBKU( - this.getConfigProvider().getDefaultBKU()); - // forget position - this.getStatus().setSignaturePosition(null); - } else if (state instanceof BKUSelectionState) { - // User jumps to bku selection state ! - // forget bku selection - this.getStatus().setBKU(BKUs.NONE); - } else if (state instanceof OpenState) { - // User jumps to data source selection state ! - // forget bku selection / restore possible default for bku - // selection - this.getStatus().setBKU( - this.getConfigProvider().getDefaultBKU()); - // forget position / restore possible default for position - this.getStatus().setSignaturePosition( - this.getConfigProvider().getDefaultSignaturePosition()); - // forget data source selection - this.getStatus().setDocument(null); - } - - this.update(); - } + this.status.setCurrentState(state); + this.update(); } /** @@ -116,7 +83,7 @@ public class StateMachineImpl implements StateMachine, GUIProvider { current.run(); if (this.mainWindow != null && !this.mainWindow.getShell().isDisposed()) { - log.debug("Allowing MainWindow to update its state for " + log.debug("Allowing MainWindow to update its state for " //$NON-NLS-1$ + current); current.updateMainWindowBehavior(); this.mainWindow.applyBehavior(); @@ -126,8 +93,8 @@ public class StateMachineImpl implements StateMachine, GUIProvider { if (next == current) { break; } - log.debug("Changing state from: " - + current + " to " + log.debug("Changing state from: " //$NON-NLS-1$ + + current + " to " //$NON-NLS-1$ + next.toString()); this.status.setCurrentState(next); } @@ -143,7 +110,7 @@ public class StateMachineImpl implements StateMachine, GUIProvider { * Invoke Update in UI (Main) Thread */ @Override - public void InvokeUpdate() { + public void invokeUpdate() { if (this.display != null) { this.display.asyncExec(new Runnable() { @@ -223,12 +190,12 @@ public class StateMachineImpl implements StateMachine, GUIProvider { } @Override - public T createComposite(Class compositeClass, int style) { + public T createComposite(Class compositeClass, int style, State state) { T composite = null; try { Constructor constructor = compositeClass.getDeclaredConstructor( - Composite.class, int.class, BKUSelectionState.class); - composite = constructor.newInstance(getComposite(), style, this); + Composite.class, int.class, State.class); + composite = constructor.newInstance(getComposite(), style, state); } catch (Exception e) { log.error( "Could not create Composite for Class " diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java index 9af0b034..e0a7b0d4 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java @@ -73,4 +73,10 @@ public interface Status { * @return the main window behavior */ public MainWindowBehavior getBehavior(); + + /** + * Gets the previous State + * @return the previous State + */ + public State getPreviousState(); } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java index 9bc4bfec..c8d74161 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java @@ -44,8 +44,11 @@ public class StatusImpl implements Status { private State currentState = null; + private State previousState = null; + private MainWindowBehavior behavior; + /** * Constructor */ @@ -59,13 +62,32 @@ public class StatusImpl implements Status { } /** - * Sets the current state - * @param currentState + * Changes the current state + * @param currentState the current State */ public void setCurrentState(State currentState) { + if (this.previousState == this.currentState) + log.error("Changing to same state? " + this.currentState); + + if (this.previousState != null && this.previousState != currentState) + { + //Reference to previous state will be lost - perform cleanup + log.debug("Cleaning up " + this.previousState); + this.previousState.cleanUp(); + } + + this.previousState = this.currentState; this.currentState = currentState; } + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.Status#getPreviousState() + */ + @Override + public State getPreviousState() { + return this.previousState; + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.Status#setDocument(java.io.File) */ @@ -119,6 +141,6 @@ public class StatusImpl implements Status { */ @Override public MainWindowBehavior getBehavior() { - return behavior; + return this.behavior; } } diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java index 86bd50c9..fe79c460 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java @@ -23,7 +23,9 @@ import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.composites.BKUSelectionComposite; +import at.asit.pdfover.gui.workflow.ConfigProvider; import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.Status; /** * Decides which BKU to use (preconfigured or let user choose) @@ -76,23 +78,38 @@ public class BKUSelectionState extends State { @Override public void run() { - - if(this.stateMachine.getStatus().getBKU() == BKUs.NONE) { + Status status = this.stateMachine.getStatus(); + if (!(status.getPreviousState() instanceof BKUSelectionState)) + { + ConfigProvider config = this.stateMachine.getConfigProvider(); + status.setBKU(config.getDefaultBKU()); + } + + if(status.getBKU() == BKUs.NONE) { BKUSelectionComposite selection = this .getSelectionComposite(); this.stateMachine.getGUIProvider().display(selection); selection.layout(); - this.stateMachine.getStatus().setBKU(selection.getSelected()); + status.setBKU(selection.getSelected()); - if(this.stateMachine.getStatus().getBKU() == BKUs.NONE) { + if(status.getBKU() == BKUs.NONE) { return; } } this.setNextState(new PrepareSigningState(this.stateMachine)); } - + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + if (this.selectionComposite != null) + this.selectionComposite.dispose(); + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java index 2d3a31ec..795090e7 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java @@ -50,6 +50,14 @@ public class LocalBKUState extends State { this.setNextState(new SigningState(this.stateMachine)); } + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // No composite - no cleanup necessary + } /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java index c160a524..3e1eb21a 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java @@ -51,6 +51,14 @@ public class MobileBKUState extends State { this.setNextState(new SigningState(this.stateMachine)); } + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // No composite - no cleanup necessary + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java index ee90a69b..1d2b94a8 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java @@ -23,7 +23,9 @@ import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.composites.DataSourceSelectComposite; +import at.asit.pdfover.gui.workflow.ConfigProvider; import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.Status; /** * Selects the data source for the signature process. @@ -47,8 +49,10 @@ public class OpenState extends State { private DataSourceSelectComposite getSelectionComposite() { if (this.selectionComposite == null) { - this.selectionComposite = new DataSourceSelectComposite( - this.stateMachine.getGUIProvider().getComposite(), SWT.RESIZE, this); + this.selectionComposite = + this.stateMachine.getGUIProvider().createComposite(DataSourceSelectComposite.class, SWT.RESIZE, this); + //this.selectionComposite = new DataSourceSelectComposite( + // this.stateMachine.getGUIProvider().getComposite(), SWT.RESIZE, this); } return this.selectionComposite; @@ -56,25 +60,43 @@ public class OpenState extends State { @Override public void run() { + Status status = this.stateMachine.getStatus(); + if (!(status.getPreviousState() instanceof PrepareConfigurationState) && + !(status.getPreviousState() instanceof OpenState)) + { + ConfigProvider config = this.stateMachine.getConfigProvider(); + status.setBKU(config.getDefaultBKU()); + status.setDocument(null); + status.setSignaturePosition(config.getDefaultSignaturePosition()); + } - if (this.stateMachine.getStatus().getDocument() == null) { + if (status.getDocument() == null) { DataSourceSelectComposite selection = this .getSelectionComposite(); this.stateMachine.getGUIProvider().display(selection); selection.layout(); - this.stateMachine.getStatus().setDocument(selection.getSelected()); + status.setDocument(selection.getSelected()); - if (this.stateMachine.getStatus().getDocument() == null) { + if (status.getDocument() == null) { // Not selected yet return; } } - log.debug("Got Datasource: " + this.stateMachine.getStatus().getDocument().getAbsolutePath()); + log.debug("Got Datasource: " + this.stateMachine.getStatus().getDocument().getAbsolutePath()); //$NON-NLS-1$ this.setNextState(new PositioningState(this.stateMachine)); } + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + if (this.selectionComposite != null) + this.selectionComposite.dispose(); + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java index 8a04dd3f..7c16d559 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java @@ -47,7 +47,15 @@ public class OutputState extends State { this.stateMachine.exit(); } - + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // TODO + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java index c7c92a89..2809bd25 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java @@ -23,7 +23,9 @@ import org.slf4j.LoggerFactory; import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.composites.PositioningComposite; +import at.asit.pdfover.gui.workflow.ConfigProvider; import at.asit.pdfover.gui.workflow.StateMachine; +import at.asit.pdfover.gui.workflow.Status; /** * Decides where to position the signature block @@ -57,21 +59,37 @@ public class PositioningState extends State { @Override public void run() { - - if(this.stateMachine.getStatus().getSignaturePosition() == null) { + Status status = this.stateMachine.getStatus(); + if (!(status.getPreviousState() instanceof PositioningState) && + !(status.getPreviousState() instanceof OpenState)) + { + status.setSignaturePosition(null); + } + + + if(status.getSignaturePosition() == null) { PositioningComposite position = this.getPositioningComosite(); this.stateMachine.getGUIProvider().display(position); - this.stateMachine.getStatus().setSignaturePosition(position.getPosition()); + status.setSignaturePosition(position.getPosition()); - if(this.stateMachine.getStatus().getSignaturePosition() == null) { + if(status.getSignaturePosition() == null) { return; } } this.setNextState(new BKUSelectionState(this.stateMachine)); } + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + if (this.positionComposite != null) + this.positionComposite.dispose(); + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java index 4fa9e362..2a71890d 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java @@ -58,6 +58,14 @@ public class PrepareConfigurationState extends State { this.setNextState(new OpenState(this.stateMachine)); } + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // No composite - no cleanup necessary + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java index 061869c1..186bf447 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java @@ -25,6 +25,8 @@ import at.asit.pdfover.gui.MainWindow.Buttons; import at.asit.pdfover.gui.composites.WaitingComposite; import at.asit.pdfover.gui.workflow.StateMachine; import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs; +import at.asit.pdfover.signator.SignatureParameter; +import at.asit.pdfover.signator.Signer; /** * User waiting state, wait for PDF Signator library to prepare document for signing. @@ -61,24 +63,52 @@ public class PrepareSigningState extends State { // TODO Auto-generated catch block e.printStackTrace(); } - this.workflow.InvokeUpdate(); + this.workflow.invokeUpdate(); } } + private final class PrepareDocumentThread implements Runnable { + + private PrepareSigningState state; + + /** + * Default constructor + * @param state + */ + public PrepareDocumentThread(PrepareSigningState state) { + this.state = state; + } + + @Override + public void run() { + try { + + + } catch (Exception e) { + log.error("PrepareDocumentThread: ", e); + } + finally { + this.state.stateMachine.invokeUpdate(); + } + } + } + /** * SFL4J Logger instance **/ private static final Logger log = LoggerFactory.getLogger(PrepareSigningState.class); - private WaitingComposite selectionComposite = null; + private SignatureParameter signatureParameter; + + private WaitingComposite waitingComposite = null; private WaitingComposite getSelectionComposite() { - if (this.selectionComposite == null) { - this.selectionComposite = new WaitingComposite( + if (this.waitingComposite == null) { + this.waitingComposite = new WaitingComposite( this.stateMachine.getGUIProvider().getComposite(), SWT.RESIZE, this); } - return this.selectionComposite; + return this.waitingComposite; } private boolean run = false; @@ -87,11 +117,17 @@ public class PrepareSigningState extends State { public void run() { // TODO SHOW BACKGROUND ACTIVITY .... WaitingComposite waiting = this.getSelectionComposite(); - + this.stateMachine.getGUIProvider().display(waiting); + Signer signer = this.stateMachine.getPDFSigner().getPDFSigner(); + + if(signatureParameter == null) { +// signatureParameter = + } + if(!this.run) { - Thread t = new Thread(new DebugSleeperThread(this.stateMachine)); + Thread t = new Thread(new PrepareDocumentThread(this)); this.run = true; t.start(); return; @@ -108,7 +144,16 @@ public class PrepareSigningState extends State { this.setNextState(new BKUSelectionState(this.stateMachine)); } } - + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + if (this.waitingComposite != null) + this.waitingComposite.dispose(); + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java index 3447fc4c..6b453d33 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java @@ -45,7 +45,15 @@ public class SigningState extends State { this.setNextState(new OutputState(this.stateMachine)); } - + + /* (non-Javadoc) + * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() + */ + @Override + public void cleanUp() { + // No composite - no cleanup necessary + } + /* (non-Javadoc) * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() */ diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java index 8b9a3ebb..95c7c5bd 100644 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java +++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java @@ -19,7 +19,6 @@ package at.asit.pdfover.gui.workflow.states; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import at.asit.pdfover.gui.MainWindowBehavior; import at.asit.pdfover.gui.workflow.StateMachine; /** @@ -70,6 +69,11 @@ public abstract class State { */ public abstract void run(); + /** + * Perform status cleanup + */ + public abstract void cleanUp(); + /** * Update the state machine */ -- cgit v1.2.3