diff options
author | Simon Rettberg | 2015-07-29 18:26:05 +0200 |
---|---|---|
committer | Simon Rettberg | 2015-07-29 18:26:05 +0200 |
commit | b4d08e310bb03d8322f996976a2f68043e5abb64 (patch) | |
tree | 8f6974fae1b9805f351818f9cb542001c6545a94 /dozentenmodul/src/main/java | |
parent | [client] Get top level window when showing message box with parent (diff) | |
download | tutor-module-b4d08e310bb03d8322f996976a2f68043e5abb64.tar.gz tutor-module-b4d08e310bb03d8322f996976a2f68043e5abb64.tar.xz tutor-module-b4d08e310bb03d8322f996976a2f68043e5abb64.zip |
[client] Started porting wizards to Swing
Diffstat (limited to 'dozentenmodul/src/main/java')
8 files changed, 389 insertions, 347 deletions
diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java index 3b8f40fe..4a09aa00 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/ImageWizard.java @@ -1,14 +1,13 @@ package org.openslx.dozmod.gui.wizard; +import javax.swing.JFrame; + import org.apache.log4j.Logger; import org.apache.thrift.TException; -import org.eclipse.jface.wizard.Wizard; -import org.eclipse.swt.widgets.TableItem; import org.openslx.bwlp.thrift.iface.ImageBaseWrite; import org.openslx.bwlp.thrift.iface.ImageVersionWrite; -import org.openslx.dozmod.gui.MainWindow; +import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.MessageType; -import org.openslx.dozmod.gui.helper.UserToPermissionLink; import org.openslx.dozmod.gui.wizard.page.ImageCustomPermissionPage; import org.openslx.dozmod.gui.wizard.page.ImageMetaDataPage; import org.openslx.dozmod.gui.wizard.page.ImageUploadPage; @@ -24,17 +23,14 @@ public class ImageWizard extends Wizard { protected ImageUploadPage imageUploadPage; protected ImageMetaDataPage imageMetaDataPage; protected ImageCustomPermissionPage imageCustomPermissionPage; - protected boolean editExistingImage; /** * Wizard for creating or editing an image * * @param editExistingImage whether to create new or edit existing image */ - public ImageWizard(boolean editExistingImage) { - super(); - setNeedsProgressMonitor(true); - this.editExistingImage = editExistingImage; + public ImageWizard(JFrame parent) { + super(parent); this.uploadWizardState = new UploadWizardState(); } @@ -47,7 +43,7 @@ public class ImageWizard extends Wizard { @Override public void addPages() { // create the shared object for all pages of the wizard - imageUploadPage = new ImageUploadPage(uploadWizardState, editExistingImage); + imageUploadPage = new ImageUploadPage(uploadWizardState); imageMetaDataPage = new ImageMetaDataPage(uploadWizardState); imageCustomPermissionPage = new ImageCustomPermissionPage(uploadWizardState); addPage(imageUploadPage); @@ -57,13 +53,8 @@ public class ImageWizard extends Wizard { @Override public boolean performFinish() { - // evaluate table state and create the map of permissions - for (TableItem tc : imageCustomPermissionPage.getTable().getItems()) { - if (tc.getData() instanceof UserToPermissionLink) { - UserToPermissionLink upl = (UserToPermissionLink) tc.getData(); - LOGGER.debug(upl.getUserId() + " has permissions: " + upl.getPermission()); - } - } + // TODO evaluate table state and create the map of permissions + // // since we only started the download and created a "blank" image entry // we can here do all the sanity checks on the fields of UploadWizardState // and react accordingly. @@ -105,7 +96,7 @@ public class ImageWizard extends Wizard { return false; } - MainWindow.showMessageBox("Creation of image worked :)", MessageType.INFO, LOGGER, null); + Gui.showMessageBox(this, "Creation of image worked :)", MessageType.INFO, LOGGER, null); return true; } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/LectureWizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/LectureWizard.java index 87348e16..e34d93b3 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/LectureWizard.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/LectureWizard.java @@ -1,7 +1,8 @@ package org.openslx.dozmod.gui.wizard; +import javax.swing.JFrame; + import org.apache.log4j.Logger; -import org.eclipse.jface.wizard.Wizard; import org.openslx.dozmod.gui.wizard.layout.LectureCreationPageLayout; import org.openslx.dozmod.gui.wizard.page.LectureCreationPage; import org.openslx.dozmod.gui.wizard.page.LectureCustomPermissionPage; @@ -18,9 +19,8 @@ public class LectureWizard extends Wizard { * Wizard for creating or editing a lecture * @param editExistingLecture whether to create new or edit existing lecture */ - public LectureWizard(boolean editExistingLecture) { - super(); - setNeedsProgressMonitor(true); + public LectureWizard(JFrame parent, boolean editExistingLecture) { + super(parent); this.editExistingLecture = editExistingLecture; } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java new file mode 100644 index 00000000..cf785d7c --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/Wizard.java @@ -0,0 +1,45 @@ +package org.openslx.dozmod.gui.wizard; + +import javax.swing.JDialog; +import javax.swing.JFrame; + +@SuppressWarnings("serial") +public abstract class Wizard extends JDialog { + + public Wizard(JFrame parent) { + super(parent, ModalityType.APPLICATION_MODAL); + } + + public String getWindowTitle() { + // TODO Auto-generated method stub + return null; + } + + protected abstract void addPages(); + + protected final void addPage(WizardPage page) { + // TODO Auto-generated method stub + } + + /** + * Called when user clicks finish. Override to do final checks and take + * appropriate actions. + * + * @return <code>true</code> if finish is allowed/succeeded, + * <code>false</code> otherwise + */ + public boolean performFinish() { + return true; + } + + void updateHeader() { + // TODO Auto-generated method stub + + } + + void updateButtons() { + // TODO Auto-generated method stub + + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java new file mode 100644 index 00000000..880e3eae --- /dev/null +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/WizardPage.java @@ -0,0 +1,109 @@ +package org.openslx.dozmod.gui.wizard; + +import javax.swing.JPanel; + +public abstract class WizardPage extends JPanel { + + private final String title; + + private String description = null; + + private String message = null; + + private boolean isError = false; + + private boolean isComplete = false; + + private Wizard wizard = null; + + /** + * Whether the user is allowed to go back to this page once they clicked + * next. + */ + protected boolean canComeBack = true; + + public WizardPage(String title) { + this.title = title; + } + + public String getTitle() { + return this.title; + } + + private void updateHeader() { + if (this.wizard != null) + this.wizard.updateHeader(); + } + + /* + * Feedback from the pages + */ + + /** + * Called when the user wants to advance to the next page. You have the + * chance to run some sanity checks and return false if you want to prevent + * the user from switching the page, but in general it is recommended to + * disable the next button as long as there are errors in the current page. + * + * @return true allows to flip the page, false cancels + */ + protected boolean goNext() { + return isComplete; + } + + /** + * Called when the page is being shown. This can be caused by three possible events: + * 1) The wizard opens and this is the fist page + * 2) The user clicked "Previous" and this is the previous page + * 3) The user clicked "Next" and this is the next page + */ + protected void onPageEnter() { + } + + /** + * Called when the page is being hidden. This can be caused by three possible events: + * 1) The user clicked finish and this is the page currently displayed + * 2) The user clicked "Previous" and this is the current page + * 3) The user clicked "Next" and this is the current page + */ + protected void onPageLeave() { + } + + /* + * Setters from derived classes + */ + + protected void setPageComplete(boolean b) { + isComplete = b; + if (wizard != null) + wizard.updateButtons(); + } + + protected void setDescription(String description) { + this.description = description; + this.updateHeader(); + } + + protected void setErrorMessage(String message) { + this.message = message; + this.isError = true; + this.updateHeader(); + } + + protected void setWarningMessage(String message) { + this.message = message; + this.isError = false; + this.updateHeader(); + } + + /* + * Setters from Wizard + */ + + void setWizard(Wizard wizard) { + if (this.wizard != null) + throw new IllegalStateException("Parent Wizard already set"); + this.wizard = wizard; + } + +} diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java index ccc66190..74f0055d 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageMetaDataPageLayout.java @@ -1,97 +1,89 @@ package org.openslx.dozmod.gui.wizard.layout; - -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; - - - +import java.awt.Component; +import java.awt.GridBagLayout; + +import javax.swing.DefaultListCellRenderer; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.border.TitledBorder; + +import org.openslx.bwlp.thrift.iface.OperatingSystem; +import org.openslx.dozmod.gui.helper.GridPos; +import org.openslx.dozmod.gui.wizard.WizardPage; + +@SuppressWarnings("serial") public abstract class ImageMetaDataPageLayout extends WizardPage { - protected Composite container; - - protected Combo osCombo; - protected Text descriptionText; - protected Button licencedSoftwareCheck; - protected Button setActiveCheck; - - // permissions checks - protected Button readPermissionsCheck; - protected Button writePermissionsCheck; - protected Button linkPermissionsCheck; - protected Button adminPermissionsCheck; - + protected JComboBox<OperatingSystem> osCombo; + protected JTextArea descriptionText; + protected JCheckBox licencedSoftwareCheck; + protected JCheckBox setActiveCheck; + // permissions checks + protected JCheckBox readPermissionsCheck; + protected JCheckBox writePermissionsCheck; + protected JCheckBox linkPermissionsCheck; + protected JCheckBox adminPermissionsCheck; /** * wizard page for entering image data at creating or editing an image */ + @SuppressWarnings("serial") public ImageMetaDataPageLayout() { - super("Eingabe Ihrer Daten", "Eingabe Ihrer Daten", null); + super("Metadaten"); setDescription("Geben Sie bitte einen aussagekräftigen Namen für das neue Image ein."); - } - - - - @Override - public void createControl(Composite parent) { - container = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - container.setLayout(layout); - layout.numColumns = 2; - - GridData gd = new GridData(GridData.FILL_HORIZONTAL); - - Label osCaption = new Label(container, SWT.NONE); - osCaption.setText("Betriebssystem:"); - osCombo = new Combo(container, SWT.DROP_DOWN | SWT.READ_ONLY | SWT.BORDER); - osCombo.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); - - Label descriptionCation = new Label(container, SWT.NONE); - descriptionCation.setText("Beschreibung:"); - descriptionText = new Text(container, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); - gd.heightHint = 80; - descriptionText.setLayoutData(gd); - - Label setActiveLabel = new Label(container, SWT.NONE); - setActiveLabel.setText("Image aktivieren"); - setActiveCheck = new Button(container, SWT.CHECK); - - - Label licencedSoftwareCaption = new Label(container, SWT.NONE); - licencedSoftwareCaption.setText("Image enthält lizenzpflichtige Software"); - licencedSoftwareCheck = new Button(container, SWT.CHECK); - licencedSoftwareCheck.setSelection(true); - - Group permissionsGroup = new Group(container, SWT.BORDER); - gd = new GridData(); - gd.horizontalSpan = 2; - permissionsGroup.setLayoutData(gd); - - - permissionsGroup.setText("Standardberechtigungen"); - permissionsGroup.setLayout(new GridLayout(4, true)); - - readPermissionsCheck = new Button(permissionsGroup, SWT.CHECK); - readPermissionsCheck.setText("Lesen"); - readPermissionsCheck.setSelection(true); - writePermissionsCheck = new Button(permissionsGroup, SWT.CHECK); - writePermissionsCheck.setText("Schreiben"); - linkPermissionsCheck = new Button(permissionsGroup, SWT.CHECK); - linkPermissionsCheck.setText("Verlinken"); - linkPermissionsCheck.setSelection(true); - adminPermissionsCheck = new Button(permissionsGroup, SWT.CHECK); - adminPermissionsCheck.setText("Admin"); - setControl(container); + setLayout(new GridBagLayout()); + + JLabel osCaption = new JLabel("Betriebssystem"); + osCombo = new JComboBox<>(); + osCombo.setEditable(false); + osCombo.setRenderer(new DefaultListCellRenderer() { + @Override + public Component getListCellRendererComponent(JList<?> list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + if (value instanceof OperatingSystem) { + OperatingSystem org = (OperatingSystem) value; + setText(org.getOsName()); + } + return this; + } + }); + add(osCaption, GridPos.get(0, 0)); + add(osCombo, GridPos.get(1, 0)); + + JLabel descriptionCation = new JLabel("Beschreibung"); + descriptionText = new JTextArea(3, 50); + add(descriptionCation, GridPos.get(0, 1)); + add(descriptionText, GridPos.get(1, 1, true, false)); + + setActiveCheck = new JCheckBox("Image aktivieren"); + add(setActiveCheck, GridPos.get(0, 2)); + licencedSoftwareCheck = new JCheckBox("Image enthält lizenzpflichtige Software"); + licencedSoftwareCheck.setSelected(true); + add(setActiveCheck, GridPos.get(0, 3)); + + // -- default permissions group -- + JPanel permissionsGroup = new JPanel(); + permissionsGroup.setBorder(new TitledBorder("Standardberechtigungen")); + + linkPermissionsCheck = new JCheckBox("Verlinken"); + linkPermissionsCheck.setSelected(true); + readPermissionsCheck = new JCheckBox("Herunterladen"); + readPermissionsCheck.setSelected(true); + writePermissionsCheck = new JCheckBox("Bearbeiten"); + adminPermissionsCheck = new JCheckBox("Administrieren"); + permissionsGroup.add(linkPermissionsCheck); + permissionsGroup.add(readPermissionsCheck); + permissionsGroup.add(writePermissionsCheck); + permissionsGroup.add(adminPermissionsCheck); + add(permissionsGroup, GridPos.get(0, 4, 2, 1, true, false)); + // -- end permissions group -- } public String getImageDescription() { diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageUploadPageLayout.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageUploadPageLayout.java index e0b074ef..616f5088 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageUploadPageLayout.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/layout/ImageUploadPageLayout.java @@ -1,24 +1,25 @@ package org.openslx.dozmod.gui.wizard.layout; -import org.eclipse.jface.wizard.WizardPage; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; +import java.awt.Dimension; +import java.awt.GridBagLayout; +import java.awt.event.KeyEvent; + +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JTextField; + import org.openslx.dozmod.gui.control.BlockProgressBar; +import org.openslx.dozmod.gui.helper.GridPos; +import org.openslx.dozmod.gui.wizard.WizardPage; +@SuppressWarnings("serial") public abstract class ImageUploadPageLayout extends WizardPage { - protected Text imageNameTextField; - protected Composite container; - protected Button imageFileBrowseButton; - protected Text imageFileTextField; - protected Button startUploadButton; + protected JTextField imageNameTextField; + protected JButton imageFileBrowseButton; + protected JTextField imageFileTextField; + protected JButton startUploadButton; protected BlockProgressBar blockProgressBar; - protected Button cancelUpload; /** * Page for uploading an imagefile @@ -28,45 +29,30 @@ public abstract class ImageUploadPageLayout extends WizardPage { */ public ImageUploadPageLayout() { super("Neue VM anlegen"); - setTitle("Neue VM anlegen"); - setDescription("Wählen Sie bitte zunächst die VM auf Ihrem lokalen Speicher aus"); - } - - @Override - public void createControl(Composite parent) { - container = new Composite(parent, SWT.NONE); - GridLayout layout = new GridLayout(); - layout.verticalSpacing = 16; - container.setLayout(layout); - layout.numColumns = 3; + setDescription("Bitte wählen Sie eine virtuelle Maschine zum Hochladen aus."); + setLayout(new GridBagLayout()); // -- Browse for VM -- - Label imageFileCaption = new Label(container, SWT.NONE); - imageFileCaption.setText("Virtuelle Maschine"); - imageFileTextField = new Text(container, SWT.BORDER | SWT.SINGLE); + JLabel imageFileCaption = new JLabel("Virtuelle Maschine"); + imageFileTextField = new JTextField(); imageFileTextField.setEditable(false); - imageFileTextField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); - imageFileBrowseButton = new Button(container, SWT.PUSH); - imageFileBrowseButton.setText("&Browse"); + imageFileBrowseButton = new JButton("Browse"); + imageFileBrowseButton.setMnemonic(KeyEvent.VK_B); + add(imageFileCaption, GridPos.get(0, 0)); + add(imageFileTextField, GridPos.get(1, 0, true, false)); + add(imageFileBrowseButton, GridPos.get(2, 0)); // -- Name -- - Label imageNameCaption = new Label(container, SWT.NONE); - imageNameCaption.setText("Name des Images"); - imageNameTextField = new Text(container, SWT.BORDER | SWT.SINGLE); - imageNameTextField.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1)); - startUploadButton = new Button(container, SWT.PUSH); - startUploadButton.setText("&Upload starten"); - startUploadButton.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, true, false, 3, 1)); - - blockProgressBar = new BlockProgressBar(container, null); - GridData gdBlockProgressBar = new GridData(SWT.FILL, SWT.DOWN, true, true, 2, 1); - gdBlockProgressBar.heightHint = 30; - blockProgressBar.setLayoutData(gdBlockProgressBar); - - cancelUpload = new Button(container, SWT.PUSH); - cancelUpload.setText("&Abbrechen"); - cancelUpload.setLayoutData(new GridData(SWT.CENTER, SWT.BOTTOM, false, true)); - - setControl(container); + JLabel imageNameCaption = new JLabel("Name des Images"); + imageNameTextField = new JTextField(); + startUploadButton = new JButton("Upload starten"); + startUploadButton.setMnemonic(KeyEvent.VK_U); + add(imageNameCaption, GridPos.get(0, 1)); + add(imageNameTextField, GridPos.get(1, 1, true, false)); + add(startUploadButton, GridPos.get(2, 1)); + + blockProgressBar = new BlockProgressBar(null); + blockProgressBar.setPreferredSize(new Dimension(200, 50)); + add(blockProgressBar, GridPos.get(0, 1, 3, 1)); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java index 795cf458..ac33bd06 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageMetaDataPage.java @@ -1,13 +1,13 @@ package org.openslx.dozmod.gui.wizard.page; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; import java.util.List; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; + import org.apache.log4j.Logger; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Composite; import org.openslx.bwlp.thrift.iface.ImagePermissions; import org.openslx.bwlp.thrift.iface.OperatingSystem; import org.openslx.bwlp.thrift.iface.ShareMode; @@ -18,6 +18,7 @@ import org.openslx.dozmod.thrift.MetaDataCache; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; +@SuppressWarnings("serial") public class ImageMetaDataPage extends ImageMetaDataPageLayout { private final static Logger LOGGER = Logger.getLogger(ImageMetaDataPage.class); @@ -28,16 +29,9 @@ public class ImageMetaDataPage extends ImageMetaDataPageLayout { super(); this.state = uploadWizardState; setPageComplete(false); - setMessage("Bitte wählen Sie das Betriebssystem aus und fügen Sie eine Beschreibung hinzu."); // HACK set fixed uploadWizardState to test functions uploadWizardState.isTemplate = false; - uploadWizardState.permissions = new ImagePermissions(true, false, true, false); uploadWizardState.shareMode = ShareMode.LOCAL; - } - - @Override - public void createControl(Composite parent) { - super.createControl(parent); // fetch the OS list QuickTimer.scheduleOnce(new Task() { @@ -48,7 +42,7 @@ public class ImageMetaDataPage extends ImageMetaDataPageLayout { osList = MetaDataCache.getOperatingSystems(); // now send the organizations back to the LoginWindow // through populateIdpCombo() - Gui.display.asyncExec(new Runnable() { + Gui.asyncExec(new Runnable() { @Override public void run() { fillOsCombo(osList); @@ -57,90 +51,52 @@ public class ImageMetaDataPage extends ImageMetaDataPageLayout { } }); - osCombo.addSelectionListener(new SelectionAdapter() { + osCombo.addItemListener(new ItemListener() { @Override - public void widgetSelected(SelectionEvent e) { - reactToUserInput(); + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange() == ItemEvent.SELECTED) { + reactToUserInput(); + } } }); - descriptionText.addKeyListener(new KeyAdapter() { - @Override - public void keyReleased(KeyEvent e) { - reactToUserInput(); - } - }); - // -- active checkbox -- - setActiveCheck.addSelectionListener(new SelectionAdapter() { + descriptionText.getDocument().addDocumentListener(new DocumentListener() { @Override - public void widgetSelected(SelectionEvent e) { - state.isEnabled = setActiveCheck.getSelection(); + public void removeUpdate(DocumentEvent e) { + changedUpdate(e); } - }); - setActiveCheck.setSelection(state.isEnabled); - // -- licensed software check -- - licencedSoftwareCheck.addSelectionListener(new SelectionAdapter() { @Override - public void widgetSelected(SelectionEvent e) { - state.isRestricted = licencedSoftwareCheck.getSelection(); + public void insertUpdate(DocumentEvent e) { + changedUpdate(e); } - }); - licencedSoftwareCheck.setSelection(state.isRestricted); - // -- checkboxes for permissions -- - readPermissionsCheck.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - state.permissions.download = readPermissionsCheck.getSelection(); - } - }); - linkPermissionsCheck.addSelectionListener(new SelectionAdapter() { @Override - public void widgetSelected(SelectionEvent e) { - state.permissions.link = linkPermissionsCheck.getSelection(); - } - }); - writePermissionsCheck.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - state.permissions.edit = writePermissionsCheck.getSelection(); - } - }); - adminPermissionsCheck.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - state.permissions.admin = adminPermissionsCheck.getSelection(); + public void changedUpdate(DocumentEvent e) { + reactToUserInput(); } }); - // -- end checkboxes for permissions -- + + setActiveCheck.setSelected(state.isEnabled); + } - /* Override setVisible() to inject some code when this page is set visible - * Note that this also gets called when we go back to this page. - * - * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean) - */ @Override - public void setVisible(boolean visible) { - boolean currentlyVisible = getControl().isVisible(); - if (!currentlyVisible && visible) { - LOGGER.debug("Entering page..."); - // Preselect OS if possible - if (state.selectedOs == null && state.detectedOs != null) { - for (int i = 0; i < osCombo.getItemCount(); ++i) { - if (state.detectedOs.getOsName().equals(osCombo.getItem(i))) { - osCombo.select(i); - break; - } - } - } + protected void onPageEnter() { + LOGGER.debug("Entering page..."); + // Preselect OS if possible + if (state.selectedOs == null && state.detectedOs != null) { + osCombo.setSelectedItem(state.detectedOs); } - // leaving this page - if (currentlyVisible && !visible) { - LOGGER.debug("Leaving page..."); - } - super.setVisible(visible); + } + + @Override + protected boolean goNext() { + state.permissions = new ImagePermissions(linkPermissionsCheck.isSelected(), + readPermissionsCheck.isSelected(), writePermissionsCheck.isSelected(), + adminPermissionsCheck.isSelected()); + state.selectedOs = (OperatingSystem)osCombo.getSelectedItem(); + return state.selectedOs != null && state.description != null; } /** @@ -148,47 +104,32 @@ public class ImageMetaDataPage extends ImageMetaDataPageLayout { */ private void fillOsCombo(List<OperatingSystem> osList) { for (OperatingSystem os : osList) { - if (os.isSetOsName()) { - osCombo.add(os.getOsName()); - osCombo.setData(os.osName, os); - } + osCombo.addItem(os); } - // Select no OS by default - osCombo.clearSelection(); + // TODO: Select no OS by default } - + /** - * Called by event listeners. This will set guidance message or error message + * Called by event listeners. This will set guidance message or error + * message * and call setPageComplete(bool) accordingly. */ private void reactToUserInput() { - final int selectionIndex = osCombo.getSelectionIndex(); - final String descriptionInput = descriptionText.getText(); - - // first check if both the combo and the description field are empty - if (selectionIndex == -1) { - if (descriptionInput.isEmpty()) { - // both empty, set the regular message - setMessage("Bitte wählen Sie das Betriebssystem aus und fügen Sie eine Beschreibung hinzu."); - } else { + if (osCombo.getSelectedIndex() == -1) { // OS empty, description input present - setMessage("Wählen Sie das Betriebssystem aus."); - } - } else { - // OS selected, save it to state - state.selectedOs = (OperatingSystem) osCombo.getData(osCombo.getItem(selectionIndex)); - if (descriptionInput.isEmpty()) { + setWarningMessage("Wählen Sie das Betriebssystem aus."); + setPageComplete(false); + return; + } + + state.description = descriptionText.getText(); + if (state.description == null || state.description.isEmpty()) { // OS set, no description - setMessage("Fügen Sie eine Beschreibung hinzu."); - } else { - // all set - setMessage("Fertig! 'Next'/'Finish' Text bla."); - } + setWarningMessage("Fügen Sie eine Beschreibung hinzu."); + setPageComplete(false); + return; } - // always save the description input, even if empty. - state.description = descriptionInput; - // final step: check if we can continue or not - setPageComplete(selectionIndex != -1 && !descriptionInput.isEmpty()); + setPageComplete(true); } } diff --git a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java index a87becd1..202bad4f 100644 --- a/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java +++ b/dozentenmodul/src/main/java/org/openslx/dozmod/gui/wizard/page/ImageUploadPage.java @@ -1,27 +1,27 @@ package org.openslx.dozmod.gui.wizard.page; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.List; +import javax.swing.JFileChooser; +import javax.swing.SwingUtilities; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.filechooser.FileNameExtensionFilter; + import org.apache.log4j.Logger; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyAdapter; -import org.eclipse.swt.events.KeyEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.FileDialog; import org.openslx.dozmod.Config; import org.openslx.dozmod.filetransfer.TransferEvent; import org.openslx.dozmod.filetransfer.TransferEventListener; import org.openslx.dozmod.filetransfer.UploadTask; import org.openslx.dozmod.gui.Gui; -import org.openslx.dozmod.gui.MainWindow; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.wizard.layout.ImageUploadPageLayout; import org.openslx.dozmod.state.UploadWizardState; @@ -38,77 +38,78 @@ public class ImageUploadPage extends ImageUploadPageLayout { private final static Logger LOGGER = Logger.getLogger(ImageUploadPage.class); private UploadWizardState state; - protected final boolean editExistingImage; private String lastDetectedName = null; - public ImageUploadPage(UploadWizardState uploadWizardState, boolean editExistingImage) { + public ImageUploadPage(UploadWizardState uploadWizardState) { super(); setPageComplete(false); - this.editExistingImage = editExistingImage; + this.canComeBack = false; this.state = uploadWizardState; - setMessage("Bitte wählen Sie eine virtuelle Maschine zum Hochladen aus."); - } - @Override - public void createControl(Composite parent) { - super.createControl(parent); - imageNameTextField.setEnabled(!editExistingImage); - imageNameTextField.addKeyListener(new KeyAdapter() { + imageNameTextField.getDocument().addDocumentListener(new DocumentListener() { + @Override + public void removeUpdate(DocumentEvent e) { + changedUpdate(e); + } + + @Override + public void insertUpdate(DocumentEvent e) { + changedUpdate(e); + } + @Override - public void keyReleased(KeyEvent e) { + public void changedUpdate(DocumentEvent e) { if (!imageNameTextField.getText().isEmpty()) { setPageComplete(state.descriptionFile != null && state.uuid != null && state.transferInformation != null); - } else + } else { setPageComplete(false); + } } }); // Browse for *.vmx - imageFileBrowseButton.addSelectionListener(new SelectionAdapter() { + imageFileBrowseButton.addActionListener(new ActionListener() { @Override - public void widgetSelected(SelectionEvent e) { + public void actionPerformed(ActionEvent e) { browseForVm(); } }); + imageFileTextField.addMouseListener(new MouseAdapter() { @Override - public void mouseUp(MouseEvent e) { - if (e.button == 1 && imageFileTextField.getClientArea().contains(e.x, e.y)) + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 1) browseForVm(); } }); // Start upload - startUploadButton.addSelectionListener(new SelectionAdapter() { + startUploadButton.addActionListener(new ActionListener() { @Override - public void widgetSelected(SelectionEvent e) { + public void actionPerformed(ActionEvent e) { createAndUploadImage(); } }); startUploadButton.setEnabled(false); - // Cancel upload - cancelUpload.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - cancelUpload(); - } - }); - cancelUpload.setVisible(false); blockProgressBar.setVisible(false); - imageFileBrowseButton.setFocus(); + imageFileBrowseButton.requestFocus(); } private void browseForVm() { - FileDialog dialog = new FileDialog(getWizard().getContainer().getShell(), SWT.OPEN); - dialog.setFilterNames(new String[] { "VMware Virtuelle Maschine (Beschreibungsdatei)" }); - dialog.setFilterExtensions(new String[] { "*.vmx" }); - dialog.setFilterPath(Config.getUploadPath()); - String ret = dialog.open(); - if (ret != null) { - vmxSelected(new File(ret).getAbsoluteFile()); - } + JFileChooser dialog = new JFileChooser(Config.getUploadPath()); + FileNameExtensionFilter filter = new FileNameExtensionFilter("Virtuelle Maschine", "vmx"); + dialog.setFileFilter(filter); + dialog.setFileSelectionMode(JFileChooser.FILES_ONLY); + + int ret = dialog.showOpenDialog(SwingUtilities.windowForComponent(this)); + if (ret != JFileChooser.APPROVE_OPTION) + return; + File file = dialog.getSelectedFile(); + if (file == null) + return; + vmxSelected(file.getAbsoluteFile()); } private void vmxSelected(File file) { @@ -116,7 +117,7 @@ public class ImageUploadPage extends ImageUploadPageLayout { try { state.meta = new VmwareMetaData(MetaDataCache.getOperatingSystems(), file); } catch (IOException e) { - MainWindow.showMessageBox("Konnte " + file.getPath() + " nicht lesen", MessageType.ERROR, LOGGER, + Gui.showMessageBox(this, "Konnte " + file.getPath() + " nicht lesen", MessageType.ERROR, LOGGER, e); setPageComplete(false); return; @@ -169,24 +170,9 @@ public class ImageUploadPage extends ImageUploadPageLayout { imageFileTextField.setText(file.getAbsolutePath()); // let the user know the upload is ready setErrorMessage(null); - setMessage("Sie können jetzt den Upload starten!"); + setDescription("Sie können jetzt den Upload starten!"); startUploadButton.setEnabled(true); - startUploadButton.setFocus(); - } - - /* Override setVisible() to inject some code when this page is set visible - * Note that this also gets called when we go back to this page. - * - * @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean) - */ - @Override - public void setVisible(boolean visible) { - if (getControl().isVisible() && !visible) { - LOGGER.debug("Leaving ImageUploadPage..."); - } else if (!getControl().isVisible() && visible) { - // - } - super.setVisible(visible); + startUploadButton.requestFocus(); } /** @@ -244,8 +230,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { state.transferInformation.getPlainPort(), state.transferInformation.getToken(), state.diskFile); } catch (FileNotFoundException e) { - MainWindow.showMessageBox("Cannot upload file: Not found", MessageType.ERROR, LOGGER, - e); + Gui.showMessageBox(getTopLevelAncestor(), "Cannot upload file: Not found", + MessageType.ERROR, LOGGER, e); return; } // -- add listener for upload status/progress -- @@ -253,7 +239,7 @@ public class ImageUploadPage extends ImageUploadPageLayout { @Override public void update(final TransferEvent event) { final TransferEventListener listener = this; - Gui.display.asyncExec(new Runnable() { + Gui.asyncExec(new Runnable() { @Override public void run() { // always callback to gui @@ -264,7 +250,7 @@ public class ImageUploadPage extends ImageUploadPageLayout { }); new Thread(state.uploadTask).start(); } - Gui.display.asyncExec(new Runnable() { + Gui.asyncExec(new Runnable() { @Override public void run() { createAndUploadImageCallback(); @@ -289,8 +275,6 @@ public class ImageUploadPage extends ImageUploadPageLayout { * know which step failed and handle the error accordingly. */ public void createAndUploadImageCallback() { - if (getShell().isDisposed()) - return; // always disable "Browse" and "Image Name" field imageNameTextField.setEnabled(false); imageFileBrowseButton.setEnabled(false); @@ -303,9 +287,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { LOGGER.debug("No transfer information in upload state!"); setErrorMessage("Fehler bei der Upload-Anfrage!"); } else if (state.uploadTask != null) { - cancelUpload.setVisible(true); blockProgressBar.setVisible(true); - setMessage("Der Upload wurde gestartet"); + setDescription("Der Upload wurde gestartet"); } setPageComplete(state.uploadTask != null); } @@ -317,12 +300,14 @@ public class ImageUploadPage extends ImageUploadPageLayout { * @param listener */ private void processTransferStatus(TransferEventListener listener, TransferEvent event) { - if (getControl().isDisposed()) { + if (!getTopLevelAncestor().isVisible()) { if (state.uploadTask != null) { state.uploadTask.removeListener(listener); } return; } + if (!isVisible()) + return; // always update progress bar if (event.progress != null) { // TODO: Maybe only display percentage in the wizard pages once we have the status bar in mainwindow @@ -333,13 +318,12 @@ public class ImageUploadPage extends ImageUploadPageLayout { // TODO: Move user interaction to central listener when we have it switch (event.state) { case FINISHED: - cancelUpload.setEnabled(false); - MainWindow.showMessageBox("Upload abgeschlossen.", MessageType.INFO, LOGGER, null); + Gui.showMessageBox(this, "Upload abgeschlossen.", MessageType.INFO, LOGGER, null); break; case ERROR: if (state.uploadTask != null && state.uploadTask.isCanceled()) return; - if (MainWindow.showMessageBox("Fehler beim Upload: " + event.errorMessage + if (Gui.showMessageBox(this, "Fehler beim Upload: " + event.errorMessage + "\nNochmal versuchen?", MessageType.ERROR_RETRY, LOGGER, null)) { // user wants to try again, just reset transferInformation ... state.uploadTask = null; @@ -356,6 +340,7 @@ public class ImageUploadPage extends ImageUploadPageLayout { } } + // TODO: In main control in main window.... private void cancelUpload() { LOGGER.debug("Cancelling upload ..."); // first tell the server about this @@ -369,15 +354,8 @@ public class ImageUploadPage extends ImageUploadPageLayout { } // Then cancel the task state.uploadTask.cancel(); - Gui.asyncExec(new Runnable() { - @Override - public void run() { - cancelUpload.setVisible(false); - } - }); } }); - cancelUpload.setEnabled(false); setPageComplete(false); blockProgressBar.setVisible(false); } |