From 66eeb6a273b1a60813375a4bf55bcc38e1a3d00a Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Wed, 25 May 2011 18:12:48 +0530 Subject: Design changes - introducing cluster-server mapping on gateway --- .../storage/management/gui/Application.java | 2 +- .../gui/NetworkInterfaceTableLabelProvider.java | 2 +- .../management/gui/actions/CreateVolumeAction.java | 14 +- .../gui/dialogs/ClusterSelectionDialog.java | 177 ++++++++++++++ .../management/gui/dialogs/LoginDialog.java | 256 +++++++++++++++++++ .../storage/management/gui/login/LoginDialog.java | 207 ---------------- .../gui/utils/PieChartViewerComposite.java | 260 ++++++++++++++++++++ .../management/gui/views/ClusterSummaryView.java | 2 +- .../gui/views/GlusterServersSummaryView.java | 2 +- .../management/gui/views/VolumesSummaryView.java | 2 +- .../details/tabcreators/ClusterTabCreator.java | 146 ----------- .../EntityGroupGlusterServerTabCreator.java | 136 ----------- .../tabcreators/EntityGroupServerTabCreator.java | 60 ----- .../tabcreators/EntityGroupVolumeTabCreator.java | 117 --------- .../tabcreators/GlusterServerTabCreator.java | 265 -------------------- .../tabcreators/PieChartViewerComposite.java | 261 -------------------- .../details/tabcreators/ServerTabCreator.java | 73 ------ .../details/tabcreators/VolumeTabCreator.java | 270 --------------------- 18 files changed, 711 insertions(+), 1541 deletions(-) create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java create mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java delete mode 100644 src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java (limited to 'src/com.gluster.storage.management.gui') diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java index 47f2cfd9..0e269c3a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Application.java @@ -34,7 +34,7 @@ import org.eclipse.ui.IWorkbench; import org.eclipse.ui.PlatformUI; import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.gui.login.LoginDialog; +import com.gluster.storage.management.gui.dialogs.LoginDialog; /** * This class controls all aspects of the application's execution diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java index 78f703ea..4f303ff4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/NetworkInterfaceTableLabelProvider.java @@ -21,7 +21,7 @@ package com.gluster.storage.management.gui; import com.gluster.storage.management.core.constants.CoreConstants; import com.gluster.storage.management.core.model.NetworkInterface; -import com.gluster.storage.management.gui.views.details.tabcreators.GlusterServerTabCreator.NETWORK_INTERFACE_TABLE_COLUMN_INDICES; +import com.gluster.storage.management.gui.views.GlusterServerSummaryView.NETWORK_INTERFACE_TABLE_COLUMN_INDICES; public class NetworkInterfaceTableLabelProvider extends TableLabelProviderAdapter { @Override diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java index 7f06bc96..1b412617 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/CreateVolumeAction.java @@ -19,8 +19,11 @@ package com.gluster.storage.management.gui.actions; import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.wizard.WizardDialog; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import com.gluster.storage.management.core.model.EntityGroup; @@ -36,7 +39,16 @@ public class CreateVolumeAction extends AbstractActionDelegate { public void run() { CreateVolumeWizard wizard = new CreateVolumeWizard(); - WizardDialog dialog = new WizardDialog(getShell(), wizard); + WizardDialog dialog = new WizardDialog(getShell(), wizard) { + @Override + protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { + Button button = super.createButton(parent, id, label, defaultButton); + if(id == IDialogConstants.FINISH_ID) { + button.setText("&Create"); + } + return button; + } + }; dialog.create(); dialog.getShell().setSize(500, 550); dialog.open(); diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java new file mode 100644 index 00000000..7bc6eb58 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/ClusterSelectionDialog.java @@ -0,0 +1,177 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console 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 Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + *******************************************************************************/ +package com.gluster.storage.management.gui.dialogs; + +import java.util.List; + +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.fieldassist.ControlDecoration; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.ModifyEvent; +import org.eclipse.swt.events.ModifyListener; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +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.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; + +import com.gluster.storage.management.gui.IImageKeys; +import com.gluster.storage.management.gui.utils.GUIHelper; + +/** + * Cluster selection dialog, which prompts for the cluster name to be managed + */ +public class ClusterSelectionDialog extends Dialog { + private Combo clusterNameCombo = null; + private Button okButton; + + private final GUIHelper guiHelper = GUIHelper.getInstance(); + private Composite composite; + private ControlDecoration errorDecoration; + private List clusters; + private String clusterName; + + public ClusterSelectionDialog(Shell parentShell, List clusters) { + super(parentShell); + this.clusters = clusters; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText("Gluster Management Console - Select Cluster"); + addEscapeListener(newShell); + } + + private void addEscapeListener(Shell shell) { + shell.addTraverseListener(new TraverseListener() { + + @Override + public void keyTraversed(TraverseEvent e) { + if (e.keyCode == SWT.ESC) { + cancelPressed(); + } + } + }); + } + + private void createClusterNameLabel(Composite composite) { + Label userIdLabel = new Label(composite, SWT.NONE); + userIdLabel.setText("&Cluster to Manage:"); + userIdLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); + } + + private void createClusterNameCombo(Composite composite) { + clusterNameCombo = new Combo(composite, SWT.BORDER); + clusterNameCombo.setItems(clusters.toArray(new String[0])); + clusterNameCombo.select(0); + +// GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false); +// layoutData.widthHint = convertWidthInCharsToPixels(32); +// clusterNameCombo.setLayoutData(layoutData); + } + + private void configureDialogLayout(Composite composite) { + GridLayout layout = (GridLayout) composite.getLayout(); + layout.numColumns = 2; + layout.marginLeft = 20; + layout.marginRight = 20; + layout.marginTop = 20; + layout.horizontalSpacing = 20; + layout.verticalSpacing = 20; + } + + /** + * Overriding to make sure that the dialog is centered in screen + */ + @Override + protected void initializeBounds() { + super.initializeBounds(); + + guiHelper.centerShellInScreen(getShell()); + } + + @Override + protected Control createDialogArea(Composite parent) { + parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE)); + // Makes sure that child composites inherit the same background + parent.setBackgroundMode(SWT.INHERIT_FORCE); + + composite = (Composite) super.createDialogArea(parent); + configureDialogLayout(composite); + + createClusterNameLabel(composite); + createClusterNameCombo(composite); + createErrorDecoration(); + + return composite; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + okButton = createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + + setupDataBinding(); + } + + private void createErrorDecoration() { + errorDecoration = guiHelper.createErrorDecoration(clusterNameCombo); + errorDecoration.setDescriptionText("Please select an existing cluster name, or enter a new one!"); + errorDecoration.hide(); + } + + /** + * Sets up data binding between the text fields and the connection details object. Also attaches a "string required" + * validator to the "password" text field. This validator is configured to do the following on validation failure
+ *
  • show an ERROR decorator
  • disable the "Login" button + */ + private void setupDataBinding() { + clusterNameCombo.addModifyListener(new ModifyListener() { + + @Override + public void modifyText(ModifyEvent e) { + if(clusterNameCombo.getText().trim().isEmpty()) { + okButton.setEnabled(false); + errorDecoration.show(); + } else { + okButton.setEnabled(true); + errorDecoration.hide(); + } + } + }); + } + + @Override + protected void okPressed() { + clusterName = clusterNameCombo.getText(); + super.okPressed(); + } + + public String getClusterName() { + return clusterName; + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java new file mode 100644 index 00000000..947a8747 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/dialogs/LoginDialog.java @@ -0,0 +1,256 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console 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 Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + *******************************************************************************/ +package com.gluster.storage.management.gui.dialogs; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.core.databinding.DataBindingContext; +import org.eclipse.core.databinding.UpdateValueStrategy; +import org.eclipse.core.databinding.beans.PojoProperties; +import org.eclipse.jface.databinding.swt.SWTObservables; +import org.eclipse.jface.databinding.swt.WidgetProperties; +import org.eclipse.jface.dialogs.Dialog; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.window.Window; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +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.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; + +import com.gluster.storage.management.client.ClustersClient; +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.client.UsersClient; +import com.gluster.storage.management.core.exceptions.GlusterRuntimeException; +import com.gluster.storage.management.core.model.ConnectionDetails; +import com.gluster.storage.management.core.model.Status; +import com.gluster.storage.management.core.response.StringListResponse; +import com.gluster.storage.management.gui.IImageKeys; +import com.gluster.storage.management.gui.utils.GUIHelper; +import com.gluster.storage.management.gui.validators.StringRequiredValidator; + +/** + * Login dialog, which prompts for the user's account info, and has Login and Cancel buttons. + */ +public class LoginDialog extends Dialog { + public static final int RETURN_CODE_ERROR = 2; + private Text userIdText = null; + private Text passwordText = null; + private Button okButton; + + private final ConnectionDetails connectionDetails = new ConnectionDetails("gluster", ""); + private final GUIHelper guiHelper = GUIHelper.getInstance(); + private Composite composite; + + public LoginDialog(Shell parentShell) { + super(parentShell); + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + + newShell.setText("Gluster Management Console"); + addEscapeListener(newShell); + } + + private void addEscapeListener(Shell shell) { + shell.addTraverseListener(new TraverseListener() { + + @Override + public void keyTraversed(TraverseEvent e) { + if (e.keyCode == SWT.ESC) { + cancelPressed(); + } + } + }); + } + + private void createUserIdLabel(Composite composite) { + Label userIdLabel = new Label(composite, SWT.NONE); + userIdLabel.setText("&User ID:"); + userIdLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); + } + + private void createUserIdText(Composite composite) { + userIdText = new Text(composite, SWT.BORDER); + userIdText.setText("gluster"); + userIdText.setEnabled(false); + + GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false); + ; + layoutData.widthHint = convertWidthInCharsToPixels(32); + userIdText.setLayoutData(layoutData); + } + + private void createPasswordLabel(Composite composite) { + Label passwordLabel = new Label(composite, SWT.NONE); + passwordLabel.setText("&Password:"); + passwordLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); + } + + private void createPasswordText(Composite composite) { + passwordText = new Text(composite, SWT.BORDER | SWT.PASSWORD); + + GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false); + ; + layoutData.widthHint = convertWidthInCharsToPixels(32); + passwordText.setLayoutData(layoutData); + } + + private void configureDialogLayout(Composite composite) { + GridLayout layout = (GridLayout) composite.getLayout(); + layout.numColumns = 2; + layout.marginLeft = 20; + layout.marginRight = 20; + layout.marginTop = 20; + layout.horizontalSpacing = 20; + layout.verticalSpacing = 20; + } + + /** + * Overriding to make sure that the dialog is centered in screen + */ + @Override + protected void initializeBounds() { + super.initializeBounds(); + + guiHelper.centerShellInScreen(getShell()); + } + + @Override + protected Control createDialogArea(Composite parent) { + parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE)); + parent.setBackgroundMode(SWT.INHERIT_FORCE); // Makes sure that child + // composites inherit + // the same background + + composite = (Composite) super.createDialogArea(parent); + configureDialogLayout(composite); + + createUserIdLabel(composite); + createUserIdText(composite); + + createPasswordLabel(composite); + createPasswordText(composite); + + return composite; + } + + @Override + protected void createButtonsForButtonBar(Composite parent) { + okButton = createButton(parent, IDialogConstants.OK_ID, "&Login", true); + createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); + + setupDataBinding(); + } + + /** + * Sets up data binding between the text fields and the connection details object. Also attaches a "string required" + * validator to the "password" text field. This validator is configured to do the following on validation failure
    + *
  • show an ERROR decorator
  • disable the "Login" button + */ + private void setupDataBinding() { + DataBindingContext dataBindingContext = new DataBindingContext(SWTObservables.getRealm(Display.getCurrent())); + UpdateValueStrategy passwordBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); + + // The Validator shows error decoration and disables OK button on + // validation failure + passwordBindingStrategy.setBeforeSetValidator(new StringRequiredValidator("Please enter password!", guiHelper + .createErrorDecoration(passwordText), okButton)); + + dataBindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(passwordText), + PojoProperties.value("password").observe(connectionDetails), passwordBindingStrategy, + passwordBindingStrategy); + + UpdateValueStrategy userIdBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); + dataBindingContext + .bindValue(WidgetProperties.text(SWT.Modify).observe(userIdText), PojoProperties.value("userId") + .observe(connectionDetails), userIdBindingStrategy, userIdBindingStrategy); + } + + protected void okPressed() { + String user = connectionDetails.getUserId(); + String password = connectionDetails.getPassword(); + + UsersClient usersClient = new UsersClient(); + if (usersClient.authenticate(user, password).isSuccess()) { + close(); + ClustersClient clustersClient = new ClustersClient(usersClient.getSecurityToken()); + List clusterNames = getClusterNames(clustersClient); + ClusterSelectionDialog clusterDialog = new ClusterSelectionDialog(getParentShell(), + clusterNames); + int userAction = clusterDialog.open(); + if (userAction == Window.CANCEL) { + MessageDialog.openError(getShell(), "Login Cancelled", + "User cancelled login at cluster selection. Application will close!"); + cancelPressed(); + return; + } + try { + String clusterName = clusterDialog.getClusterName(); + if(clusterNames.contains(clusterName)) { + GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), + clusterName); + } else { + Status status = createCluster(clustersClient, clusterName); + if(!status.isSuccess()) { + MessageDialog.openError(getShell(), "Cluster Creation Failed!", status.toString()); + setReturnCode(RETURN_CODE_ERROR); + return; + } + GlusterDataModelManager.getInstance().initializeModelWithNewCluster(usersClient.getSecurityToken(), + clusterName); + } + super.okPressed(); + + } catch (Exception e) { + setReturnCode(RETURN_CODE_ERROR); + MessageDialog.openError(getShell(), "Initialization Error", e.getMessage()); + close(); + } + } else { + MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password"); + } + } + + private Status createCluster(ClustersClient clustersClient, String clusterName) { + return clustersClient.createCluster(clusterName); + } + + private List getClusterNames(ClustersClient clustersClient) { + StringListResponse clustersResponse = clustersClient.getClusters(); + List clusters = new ArrayList(); + if (clustersResponse.getStatus().isSuccess()) { + clusters = clustersResponse.getData(); + } else { + throw new GlusterRuntimeException("Could not fetch cluster names. Error: " + clustersResponse.getStatus()); + } + return clusters; + } +} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java deleted file mode 100644 index 7705a631..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java +++ /dev/null @@ -1,207 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.login; - -import org.eclipse.core.databinding.DataBindingContext; -import org.eclipse.core.databinding.UpdateValueStrategy; -import org.eclipse.core.databinding.beans.PojoProperties; -import org.eclipse.jface.databinding.swt.SWTObservables; -import org.eclipse.jface.databinding.swt.WidgetProperties; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.jface.dialogs.IDialogConstants; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; -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.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -import com.gluster.storage.management.client.GlusterDataModelManager; -import com.gluster.storage.management.client.UsersClient; -import com.gluster.storage.management.core.model.ConnectionDetails; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.validators.StringRequiredValidator; - -/** - * Login dialog, which prompts for the user's account info, and has Login and Cancel buttons. - */ -public class LoginDialog extends Dialog { - public static final int RETURN_CODE_ERROR = 2; - private Text userIdText = null; - private Text passwordText = null; - private Button okButton; - - private final ConnectionDetails connectionDetails = new ConnectionDetails("gluster", ""); - private final GUIHelper guiHelper = GUIHelper.getInstance(); - private Composite composite; - - public LoginDialog(Shell parentShell) { - super(parentShell); - } - - @Override - protected void configureShell(Shell newShell) { - super.configureShell(newShell); - - newShell.setText("Gluster Management Console"); - addEscapeListener(newShell); - } - - private void addEscapeListener(Shell shell) { - shell.addTraverseListener(new TraverseListener() { - - @Override - public void keyTraversed(TraverseEvent e) { - if (e.keyCode == SWT.ESC) { - cancelPressed(); - } - } - }); - } - - private void createUserIdLabel(Composite composite) { - Label userIdLabel = new Label(composite, SWT.NONE); - userIdLabel.setText("&User ID:"); - userIdLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); - } - - private void createUserIdText(Composite composite) { - userIdText = new Text(composite, SWT.BORDER); - userIdText.setText("gluster"); - userIdText.setEnabled(false); - - GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false); - ; - layoutData.widthHint = convertWidthInCharsToPixels(32); - userIdText.setLayoutData(layoutData); - } - - private void createPasswordLabel(Composite composite) { - Label passwordLabel = new Label(composite, SWT.NONE); - passwordLabel.setText("&Password:"); - passwordLabel.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); - } - - private void createPasswordText(Composite composite) { - passwordText = new Text(composite, SWT.BORDER | SWT.PASSWORD); - - GridData layoutData = new GridData(SWT.FILL, GridData.FILL, true, false); - ; - layoutData.widthHint = convertWidthInCharsToPixels(32); - passwordText.setLayoutData(layoutData); - } - - private void configureDialogLayout(Composite composite) { - GridLayout layout = (GridLayout) composite.getLayout(); - layout.numColumns = 2; - layout.marginLeft = 20; - layout.marginRight = 20; - layout.marginTop = 20; - layout.horizontalSpacing = 20; - layout.verticalSpacing = 20; - } - - /** - * Overriding to make sure that the dialog is centered in screen - */ - @Override - protected void initializeBounds() { - super.initializeBounds(); - - guiHelper.centerShellInScreen(getShell()); - } - - @Override - protected Control createDialogArea(Composite parent) { - parent.setBackgroundImage(guiHelper.getImage(IImageKeys.DIALOG_SPLASH_IMAGE)); - parent.setBackgroundMode(SWT.INHERIT_FORCE); // Makes sure that child - // composites inherit - // the same background - - composite = (Composite) super.createDialogArea(parent); - configureDialogLayout(composite); - - createUserIdLabel(composite); - createUserIdText(composite); - - createPasswordLabel(composite); - createPasswordText(composite); - - return composite; - } - - @Override - protected void createButtonsForButtonBar(Composite parent) { - okButton = createButton(parent, IDialogConstants.OK_ID, "&Login", true); - createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false); - - setupDataBinding(); - } - - /** - * Sets up data binding between the text fields and the connection details object. Also attaches a "string required" - * validator to the "password" text field. This validator is configured to do the following on validation failure
    - *
  • show an ERROR decorator
  • disable the "Login" button - */ - private void setupDataBinding() { - DataBindingContext dataBindingContext = new DataBindingContext(SWTObservables.getRealm(Display.getCurrent())); - UpdateValueStrategy passwordBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); - - // The Validator shows error decoration and disables OK button on - // validation failure - passwordBindingStrategy.setBeforeSetValidator(new StringRequiredValidator("Please enter password!", guiHelper - .createErrorDecoration(passwordText), okButton)); - - dataBindingContext.bindValue(WidgetProperties.text(SWT.Modify).observe(passwordText), - PojoProperties.value("password").observe(connectionDetails), passwordBindingStrategy, - passwordBindingStrategy); - - UpdateValueStrategy userIdBindingStrategy = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); - dataBindingContext - .bindValue(WidgetProperties.text(SWT.Modify).observe(userIdText), PojoProperties.value("userId") - .observe(connectionDetails), userIdBindingStrategy, userIdBindingStrategy); - } - - protected void okPressed() { - String user = connectionDetails.getUserId(); - String password = connectionDetails.getPassword(); - - UsersClient usersClient = new UsersClient(); - if (usersClient.authenticate(user, password).isSuccess()) { - try { - GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), "127.0.0.1"); - super.okPressed(); - } catch (Exception e) { - setReturnCode(RETURN_CODE_ERROR); - MessageDialog.openError(getShell(), "Initialization Error", e.getMessage()); - close(); - } - } else { - MessageDialog.openError(getShell(), "Authentication Failed", "Invalid User ID or password"); - } - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java new file mode 100644 index 00000000..ad8e2fa3 --- /dev/null +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/PieChartViewerComposite.java @@ -0,0 +1,260 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console 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 Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * . + *******************************************************************************/ +package com.gluster.storage.management.gui.utils; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.eclipse.birt.chart.api.ChartEngine; +import org.eclipse.birt.chart.device.IDeviceRenderer; +import org.eclipse.birt.chart.device.IUpdateNotifier; +import org.eclipse.birt.chart.exception.ChartException; +import org.eclipse.birt.chart.factory.GeneratedChartState; +import org.eclipse.birt.chart.factory.Generator; +import org.eclipse.birt.chart.model.Chart; +import org.eclipse.birt.chart.model.ChartWithoutAxes; +import org.eclipse.birt.chart.model.attribute.Bounds; +import org.eclipse.birt.chart.model.attribute.ChartDimension; +import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl; +import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl; +import org.eclipse.birt.chart.model.component.Series; +import org.eclipse.birt.chart.model.component.impl.SeriesImpl; +import org.eclipse.birt.chart.model.data.NumberDataSet; +import org.eclipse.birt.chart.model.data.SeriesDefinition; +import org.eclipse.birt.chart.model.data.TextDataSet; +import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl; +import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl; +import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl; +import org.eclipse.birt.chart.model.impl.ChartWithoutAxesImpl; +import org.eclipse.birt.chart.model.layout.Legend; +import org.eclipse.birt.chart.model.layout.Plot; +import org.eclipse.birt.chart.model.type.PieSeries; +import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl; +import org.eclipse.birt.core.framework.PlatformConfig; +import org.eclipse.core.runtime.Platform; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.widgets.Composite; + + +/** + * + */ +public final class PieChartViewerComposite extends Composite implements + PaintListener, IUpdateNotifier { + + private IDeviceRenderer deviceReader = null; + private Chart chart = null; + private GeneratedChartState generatedChartState = null; + private boolean needsGeneration = true; + + private static Logger logger = Logger + .getLogger(PieChartViewerComposite.class.getName()); + + /** + * @param parent + * Parent composite of this pie chart viewer composite + * @param style + * SWT style to be used + * @param categories + * Categories of the pie chart + * @param values + * Values of each category in the pie chart Constructs a pie + * chart viewer composite for given categories and values + */ + public PieChartViewerComposite(Composite parent, int style, String[] categories, + Double[] values) { + super(parent, style); + try { + PlatformConfig config = new PlatformConfig(); + config.setBIRTHome(Platform.getInstallLocation().getURL().getPath()); + // Get the connection with SWT device to render the graphics. + deviceReader = ChartEngine.instance(config).getRenderer("dv.SWT");//$NON-NLS-1$ + } catch (ChartException ex) { + logger.log(Level.SEVERE, "Could not create Chart Renderer for SWT", + ex); + } + + addControlListener(new ControlListener() { + + public void controlMoved(ControlEvent e) { + needsGeneration = true; + } + + public void controlResized(ControlEvent e) { + needsGeneration = true; + } + }); + + chart = createPieChart(categories, values); + addPaintListener(this); + } + + /** + * @param categories + * Categories of the pie chart + * @param values + * Values of each category in the pie chart + * @return The chart object created for given categories and values + */ + public static final Chart createPieChart(String[] categories, + Double[] values) { + ChartWithoutAxes pieChart = ChartWithoutAxesImpl.create(); + + // Plot + pieChart.setSeriesThickness(10); + pieChart.setDimension(ChartDimension.TWO_DIMENSIONAL_WITH_DEPTH_LITERAL); + pieChart.getBlock().setBackground(ColorDefinitionImpl.WHITE()); + Plot p = pieChart.getPlot(); + + p.getClientArea().setBackground(null); + p.getClientArea().getOutline().setVisible(false); + p.getOutline().setVisible(false); + + // Legend + Legend lg = pieChart.getLegend(); + lg.setMaxPercent(0.7); + lg.getText().getFont().setSize(9); + lg.setBackground(null); + lg.getOutline().setVisible(false); + lg.setVisible(true); + + // Title + pieChart.getTitle().getLabel().getCaption().setValue("Pie Chart");//$NON-NLS-1$ + pieChart.getTitle().getOutline().setVisible(false); + pieChart.getTitle().setVisible(false); + + TextDataSet categoryValues = TextDataSetImpl.create(categories); + NumberDataSet seriesOneValues = NumberDataSetImpl.create(values); + + // Base Series + Series seCategory = SeriesImpl.create(); + seCategory.setDataSet(categoryValues); + + SeriesDefinition sd = SeriesDefinitionImpl.create(); + pieChart.getSeriesDefinitions().add(sd); + sd.setSeriesPalette(new GlusterChartPalette()); + sd.getSeriesPalette().shift(0); + sd.getSeries().add(seCategory); + + // Orthogonal Series + PieSeries sePie = (PieSeries) PieSeriesImpl.create(); + sePie.setRatio(0.60); + sePie.setDataSet(seriesOneValues); + sePie.setSeriesIdentifier("Chart");//$NON-NLS-1$ + sePie.getTitle().setVisible(false); // no title + sePie.getLabel().setVisible(false); // no label (values) + sePie.setExplosion(0); // no gap between the pie slices + + SeriesDefinition seriesDefinition = SeriesDefinitionImpl.create(); + seriesDefinition.getQuery().setDefinition("query.definition");//$NON-NLS-1$ + sd.getSeriesDefinitions().add(seriesDefinition); + seriesDefinition.getSeries().add(sePie); + + return pieChart; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events + * .PaintEvent) + */ + public final void paintControl(PaintEvent e) { + Rectangle d = ((Composite) e.getSource()).getBounds(); + Image imgChart = new Image(this.getDisplay(), d); + GC gcImage = new GC(imgChart); + deviceReader.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, gcImage); + deviceReader.setProperty(IDeviceRenderer.UPDATE_NOTIFIER, this); + + Bounds bo = BoundsImpl.create(0, 0, d.width, d.height); + bo.scale(58d / deviceReader.getDisplayServer().getDpiResolution()); + + Generator gr = Generator.instance(); + if (needsGeneration) { + needsGeneration = false; + try { + generatedChartState = gr.build(deviceReader.getDisplayServer(), + chart, bo, null, null, null); + } catch (ChartException ce) { + ce.printStackTrace(); + } + } + + try { + gr.render(deviceReader, generatedChartState); + GC gc = e.gc; + gc.drawImage(imgChart, d.x, d.y); + } catch (ChartException gex) { + logger.log(Level.SEVERE, "Exception while rendering pie chart [" + + gex.getMessage() + "]", gex); + } + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.birt.chart.device.IUpdateNotifier#getDesignTimeModel() + */ + public Chart getDesignTimeModel() { + return chart; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.birt.chart.device.IUpdateNotifier#getRunTimeModel() + */ + public Chart getRunTimeModel() { + return generatedChartState.getChartModel(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.birt.chart.device.IUpdateNotifier#peerInstance() + */ + public Object peerInstance() { + return this; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.birt.chart.device.IUpdateNotifier#regenerateChart() + */ + public void regenerateChart() { + redraw(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.birt.chart.device.IUpdateNotifier#repaintChart() + */ + public void repaintChart() { + redraw(); + } +} \ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java index c37bcd76..efecbf7a 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/ClusterSummaryView.java @@ -54,7 +54,7 @@ import com.gluster.storage.management.core.utils.NumberUtil; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.actions.IActionConstants; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite; +import com.gluster.storage.management.gui.utils.PieChartViewerComposite; /** * @author root diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java index 080ebace..ba9faca4 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersSummaryView.java @@ -34,7 +34,7 @@ import com.gluster.storage.management.core.model.EntityGroup; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite; +import com.gluster.storage.management.gui.utils.PieChartViewerComposite; /** * diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java index bc136b61..88ca96c5 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java @@ -39,7 +39,7 @@ import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; import com.gluster.storage.management.gui.IImageKeys; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.tabcreators.PieChartViewerComposite; +import com.gluster.storage.management.gui.utils.PieChartViewerComposite; /** * diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java deleted file mode 100644 index 571afb2e..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ClusterTabCreator.java +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.events.HyperlinkAdapter; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.ImageHyperlink; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.core.model.Cluster; -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; -import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.TabCreator; - -public class ClusterTabCreator implements TabCreator { - private GUIHelper guiHelper = GUIHelper.getInstance(); - - private int getVolumeCountByStatus(Cluster cluster, VOLUME_STATUS status) { - int count = 0; - for (Volume volume : cluster.getVolumes()) { - if (volume.getStatus() == status) { - count++; - } - } - return count; - } - - private int getServerCountByStatus(Cluster cluster, SERVER_STATUS status) { - int count = 0; - for (GlusterServer server : cluster.getServers()) { - if (server.getStatus() == status) { - count++; - } - } - return count; - } - - private void createVolumesSection(Cluster cluster, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Volumes", null, 1, false); - - // toolkit.createLabel(sectionClient, "Number of Volumes: ", SWT.NONE); - // toolkit.createLabel(sectionClient, "12", SWT.NONE); - // - // toolkit.createLabel(sectionClient, "Online: ", SWT.NONE); - // Label labelOnlineCount = toolkit.createLabel(sectionClient, "9", SWT.NONE); - // labelOnlineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN)); - // - // toolkit.createLabel(sectionClient, "Offline: ", SWT.NONE); - // Label lblOfflineCount = toolkit.createLabel(sectionClient, "3", SWT.NONE); - // lblOfflineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED)); - - Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(cluster, VOLUME_STATUS.ONLINE)), - Double.valueOf(getVolumeCountByStatus(cluster, VOLUME_STATUS.OFFLINE)) }; - createStatusChart(toolkit, section, values); - } - - private void createServersSection(Cluster cluster, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Servers", null, 1, false); - -// toolkit.createLabel(sectionClient, "Number of Servers: ", SWT.NONE); -// toolkit.createLabel(sectionClient, "7", SWT.NONE); -// -// toolkit.createLabel(sectionClient, "Online: ", SWT.NONE); -// Label labelOnlineCount = toolkit.createLabel(sectionClient, "6", SWT.NONE); -// labelOnlineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_GREEN)); -// -// toolkit.createLabel(sectionClient, "Offline: ", SWT.NONE); -// Label lblOfflineCount = toolkit.createLabel(sectionClient, "1", SWT.NONE); -// lblOfflineCount.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED)); - - Double[] values = new Double[] { Double.valueOf(getServerCountByStatus(cluster, SERVER_STATUS.ONLINE)), - Double.valueOf(getServerCountByStatus(cluster, SERVER_STATUS.OFFLINE)) }; - - createStatusChart(toolkit, section, values); - } - - private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) { - String[] categories = new String[] { "Online", "Offline" }; - PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories, values); - - GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); - data.widthHint = 250; - data.heightHint = 250; - chartViewerComposite.setLayoutData(data); - } - - private void createActionsSection(final Cluster cluster, final FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Actions", null, 1, false); - - ImageHyperlink imageHyperlink = toolkit.createImageHyperlink(section, SWT.NONE); - imageHyperlink.setText("Create Volume"); - imageHyperlink.setImage(guiHelper.getImage(IImageKeys.CREATE_VOLUME_BIG)); - imageHyperlink.addHyperlinkListener(new HyperlinkAdapter() { - // TODO: Override appropriate method and handle hyperlink event - }); - - imageHyperlink = toolkit.createImageHyperlink(section, SWT.NONE); - imageHyperlink.setText("Add Server(s)"); - imageHyperlink.setImage(guiHelper.getImage(IImageKeys.ADD_SERVER_BIG)); - imageHyperlink.addHyperlinkListener(new HyperlinkAdapter() { - // TODO: Override appropriate method and handle hyperlink event - }); - } - - private void createClusterSummaryTab(final Cluster cluster, final TabFolder tabFolder, final FormToolkit toolkit) { - Composite summaryTab = guiHelper.createTab(tabFolder, cluster.getName(), IImageKeys.CLUSTER); - - final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Cluster Summary"); - createVolumesSection(cluster, toolkit, form); - createServersSection(cluster, toolkit, form); - createActionsSection(cluster, toolkit, form); - - summaryTab.layout(); // IMP: lays out the form properly - } - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createClusterSummaryTab((Cluster) entity, tabFolder, toolkit); - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java deleted file mode 100644 index 3c94c3cc..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java +++ /dev/null @@ -1,136 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.core.model.Disk; -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.EntityGroup; -import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.NavigationView; -import com.gluster.storage.management.gui.views.details.DisksPage; -import com.gluster.storage.management.gui.views.details.GlusterServersPage; -import com.gluster.storage.management.gui.views.details.TabCreator; - -public class EntityGroupGlusterServerTabCreator implements TabCreator, IDoubleClickListener { - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - private int getServerCountByStatus(EntityGroup servers, SERVER_STATUS status) { - int count = 0; - for (GlusterServer server : (List)servers.getEntities()) { - if (server.getStatus() == status) { - count++; - } - } - return count; - } - - private void createAlertsSection(final EntityGroup servers, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false); - - toolkit.createLabel(section, "Any alerts related to servers\nwill be displayed here."); - } - - private void createRunningTasksSection(final EntityGroup servers, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false); - - toolkit.createLabel(section, "List of running tasks related to\nservers will be displayed here."); - } - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createSummaryTab((EntityGroup)entity, tabFolder, toolkit); - createServersTab((EntityGroup)entity, tabFolder, toolkit); - createDisksTab((EntityGroup)entity, tabFolder, toolkit, site); - } - - private void createServersTab(EntityGroup servers, TabFolder tabFolder, FormToolkit toolkit) { - Composite serversTab = guiHelper.createTab(tabFolder, "Servers", IImageKeys.SERVERS); - GlusterServersPage page = new GlusterServersPage(serversTab, SWT.NONE, servers); - page.addDoubleClickListener(this); - } - - private void createSummaryTab(EntityGroup servers, TabFolder tabFolder, FormToolkit toolkit) { - Composite summaryTab = guiHelper.createTab(tabFolder, "Summary", IImageKeys.SERVERS); - final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Servers - Summary"); - createSummarySection(servers, toolkit, form); - createRunningTasksSection(servers, toolkit, form); - createAlertsSection(servers, toolkit, form); - - summaryTab.layout(); // IMP: lays out the form properly - } - - private void createSummarySection(final EntityGroup servers, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false); - - Double[] values = new Double[] { Double.valueOf(getServerCountByStatus(servers, SERVER_STATUS.ONLINE)), - Double.valueOf(getServerCountByStatus(servers, SERVER_STATUS.OFFLINE)) }; - createStatusChart(toolkit, section, values); - } - - private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) { - String[] categories = new String[] { "Online", "Offline" }; - PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories, values); - - GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); - data.widthHint = 250; - data.heightHint = 250; - chartViewerComposite.setLayoutData(data); - } - - - private void createDisksTab(EntityGroup servers, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - Composite disksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.SERVERS); - DisksPage page = new DisksPage(disksTab, SWT.NONE, site, getAllDisks(servers)); - - disksTab.layout(); // IMP: lays out the form properly - } - - private List getAllDisks(EntityGroup servers) { - List disks = new ArrayList(); - for(GlusterServer server : (List)servers.getEntities()) { - disks.addAll(server.getDisks()); - } - return disks; - } - - @Override - public void doubleClick(DoubleClickEvent event) { - NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID); - if (clusterView != null) { - clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement()); - } - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java deleted file mode 100644 index 3f49ba6b..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.widgets.FormToolkit; - -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.EntityGroup; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.NavigationView; -import com.gluster.storage.management.gui.views.details.TabCreator; -import com.gluster.storage.management.gui.views.pages.ServersPage; - -public class EntityGroupServerTabCreator implements TabCreator, IDoubleClickListener { - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createServersTab((EntityGroup) entity, tabFolder); - } - - private void createServersTab(EntityGroup servers, TabFolder tabFolder) { - Composite serversTab = guiHelper.createTab(tabFolder, "Discovered Servers", IImageKeys.SERVERS); - ServersPage page = new ServersPage(serversTab, null, servers); - page.addDoubleClickListener(this); - } - - @Override - public void doubleClick(DoubleClickEvent event) { - NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID); - if (clusterView != null) { - clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement()); - } - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java deleted file mode 100644 index 22ffd94d..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java +++ /dev/null @@ -1,117 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import java.util.List; - -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.EntityGroup; -import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.model.Volume.VOLUME_STATUS; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.NavigationView; -import com.gluster.storage.management.gui.views.details.TabCreator; -import com.gluster.storage.management.gui.views.pages.VolumesPage; - -public class EntityGroupVolumeTabCreator implements TabCreator, IDoubleClickListener { - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createSummaryTab((EntityGroup) entity, tabFolder, toolkit); - createVolumesTab((EntityGroup) entity, tabFolder, toolkit); - } - - private int getVolumeCountByStatus(EntityGroup volumes, VOLUME_STATUS status) { - int count = 0; - for (Volume volume : (List) volumes.getEntities()) { - if (volume.getStatus() == status) { - count++; - } - } - return count; - } - - private void createStatusChart(FormToolkit toolkit, Composite section, Double[] values) { - String[] categories = new String[] { "Online", "Offline" }; - PieChartViewerComposite chartViewerComposite = new PieChartViewerComposite(section, SWT.NONE, categories, - values); - - GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); - data.widthHint = 250; - data.heightHint = 250; - chartViewerComposite.setLayoutData(data); - } - - private void createAlertsSection(final EntityGroup volumes, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 2, false); - - toolkit.createLabel(section, "Any alerts related to volumes\nwill be displayed here."); - } - - private void createRunningTasksSection(final EntityGroup volumes, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Running Tasks", null, 2, false); - - toolkit.createLabel(section, "List of running tasks related to\nvolumes will be displayed here."); - } - - private void createSummarySection(final EntityGroup volumes, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false); - - Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)), - Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.OFFLINE)) }; - createStatusChart(toolkit, section, values); - } - - private void createSummaryTab(final EntityGroup volumes, TabFolder tabFolder, FormToolkit toolkit) { - Composite summaryTab = guiHelper.createTab(tabFolder, "Summary", IImageKeys.VOLUMES); - final ScrolledForm form = guiHelper.setupForm(summaryTab, toolkit, "Volumes - Summary"); - createSummarySection(volumes, toolkit, form); - createRunningTasksSection(volumes, toolkit, form); - createAlertsSection(volumes, toolkit, form); - - summaryTab.layout(); // IMP: lays out the form properly - } - - private void createVolumesTab(EntityGroup volumes, TabFolder tabFolder, FormToolkit toolkit) { - Composite volumesTab = guiHelper.createTab(tabFolder, "Volumes", IImageKeys.VOLUMES); - VolumesPage page = new VolumesPage(volumesTab, null, volumes); - page.addDoubleClickListener(this); - } - - @Override - public void doubleClick(DoubleClickEvent event) { - NavigationView clusterView = (NavigationView) guiHelper.getView(NavigationView.ID); - if (clusterView != null) { - clusterView.selectEntity((Entity) ((StructuredSelection) event.getSelection()).getFirstElement()); - } - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java deleted file mode 100644 index 00318373..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/GlusterServerTabCreator.java +++ /dev/null @@ -1,265 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.layout.TableColumnLayout; -import org.eclipse.jface.viewers.ArrayContentProvider; -import org.eclipse.jface.viewers.ColumnWeightData; -import org.eclipse.jface.viewers.TableViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.ProgressBar; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.swt.widgets.Table; -import org.eclipse.swt.widgets.TableColumn; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.events.HyperlinkAdapter; -import org.eclipse.ui.forms.events.HyperlinkEvent; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.Hyperlink; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; -import com.gluster.storage.management.core.utils.NumberUtil; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.NetworkInterfaceTableLabelProvider; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.ServerDisksPage; -import com.gluster.storage.management.gui.views.details.ServerLogsPage; -import com.gluster.storage.management.gui.views.details.TabCreator; -import com.richclientgui.toolbox.gauges.CoolGauge; - -public class GlusterServerTabCreator implements TabCreator { - public enum NETWORK_INTERFACE_TABLE_COLUMN_INDICES { - INTERFACE, MODEL, SPEED, IP_ADDRESS, NETMASK, GATEWAY - }; - - private static final String[] NETWORK_INTERFACE_TABLE_COLUMN_NAMES = { "Interface", "Model", "Speed", "IP Address", - "Netmask", "Gateway" }; - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - private void createServerSummarySection(GlusterServer server, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Summary", null, 2, false); - - // toolkit.createLabel(section, "Preferred Network: ", SWT.NONE); - // toolkit.createLabel(section, server.getPreferredNetworkInterface().getName(), SWT.NONE); - - boolean online = server.getStatus() == SERVER_STATUS.ONLINE; - - if (online) { - toolkit.createLabel(section, "Number of CPUs: ", SWT.NONE); - toolkit.createLabel(section, "" + server.getNumOfCPUs(), SWT.NONE); - - // toolkit.createLabel(section, "CPU Usage (%): ", SWT.NONE); - // toolkit.createLabel(section, online ? "" + server.getCpuUsage() : "NA", SWT.NONE); - - toolkit.createLabel(section, "% CPU Usage (avg): ", SWT.NONE); - CoolGauge gauge = new CoolGauge(section, guiHelper.getImage(IImageKeys.GAUGE_SMALL)); - gauge.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false)); - gauge.setGaugeNeedleColour(Display.getDefault().getSystemColor(SWT.COLOR_RED)); - gauge.setGaugeNeedleWidth(2); - gauge.setGaugeNeedlePivot(new Point(66, 65)); - - gauge.setPoints(getPnts()); - gauge.setLevel(server.getCpuUsage() / 100); - gauge.setToolTipText(server.getCpuUsage() + "%"); - - toolkit.createLabel(section, "Memory Usage: ", SWT.NONE); - ProgressBar memoryUsageBar = new ProgressBar(section, SWT.SMOOTH); - memoryUsageBar.setMinimum(0); - memoryUsageBar.setMaximum((int) Math.round(server.getTotalMemory())); - memoryUsageBar.setSelection((int) Math.round(server.getMemoryInUse())); - memoryUsageBar.setToolTipText("Total: " + server.getTotalMemory() + "GB, In Use: " - + server.getMemoryInUse() + "GB"); - - // toolkit.createLabel(section, "Memory Usage: ", SWT.NONE); - // final CoolProgressBar bar = new CoolProgressBar(section,SWT.HORIZONTAL, - // guiHelper.getImage(IImageKeys.PROGRESS_BAR_LEFT), - // guiHelper.getImage(IImageKeys.PROGRESS_BAR_FILLED), - // guiHelper.getImage(IImageKeys.PROGRESS_BAR_EMPTY), - // guiHelper.getImage(IImageKeys.PROGRESS_BAR_RIGHT)); - // bar.updateProgress(server.getMemoryInUse() / server.getTotalMemory()); - - // toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE); - // toolkit.createLabel(section, online ? "" + server.getTotalDiskSpace() : "NA", SWT.NONE); - // - // toolkit.createLabel(section, "Disk Space in Use (GB): ", SWT.NONE); - // toolkit.createLabel(section, online ? "" + server.getDiskSpaceInUse() : "NA", SWT.NONE); - - toolkit.createLabel(section, "Disk Usage: ", SWT.NONE); - ProgressBar diskUsageBar = new ProgressBar(section, SWT.SMOOTH); - diskUsageBar.setMinimum(0); - diskUsageBar.setMaximum((int) Math.round(server.getTotalDiskSpace())); - diskUsageBar.setSelection((int) Math.round(server.getDiskSpaceInUse())); - diskUsageBar.setToolTipText("Total: " + NumberUtil.formatNumber(server.getTotalDiskSpace()) - + "GB, In Use: " + NumberUtil.formatNumber(server.getDiskSpaceInUse()) + "GB"); - } - - toolkit.createLabel(section, "Status: ", SWT.NONE); - CLabel lblStatusValue = new CLabel(section, SWT.NONE); - lblStatusValue.setText(server.getStatusStr()); - lblStatusValue.setImage(server.getStatus() == GlusterServer.SERVER_STATUS.ONLINE ? guiHelper - .getImage(IImageKeys.STATUS_ONLINE) : guiHelper.getImage(IImageKeys.STATUS_OFFLINE)); - toolkit.adapt(lblStatusValue, true, true); - } - - private List getPnts() { - final List pnts = new ArrayList(); - pnts.add(new Point(47, 98)); - pnts.add(new Point(34, 84)); - pnts.add(new Point(29, 65)); - pnts.add(new Point(33, 48)); - pnts.add(new Point(48, 33)); - pnts.add(new Point(66, 28)); - pnts.add(new Point(83, 32)); - pnts.add(new Point(98, 47)); - pnts.add(new Point(103, 65)); - pnts.add(new Point(98, 83)); - pnts.add(new Point(84, 98)); - return pnts; - } - - private void createServerSummaryTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit) { - String serverName = server.getName(); - Composite serverSummaryTab = guiHelper.createTab(tabFolder, serverName, IImageKeys.SERVER); - final ScrolledForm form = guiHelper.setupForm(serverSummaryTab, toolkit, "Server Summary [" + serverName + "]"); - createServerSummarySection(server, toolkit, form); - - if (server.getStatus() == SERVER_STATUS.ONLINE) { - Composite section = createNetworkInterfacesSection(server, toolkit, form); - } - - serverSummaryTab.layout(); // IMP: lays out the form properly - } - - private void setupNetworkInterfaceTable(Composite parent, Table table) { - table.setHeaderVisible(true); - table.setLinesVisible(false); - - TableColumnLayout tableColumnLayout = guiHelper.createTableColumnLayout(table, - NETWORK_INTERFACE_TABLE_COLUMN_NAMES); - parent.setLayout(tableColumnLayout); - - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.INTERFACE, SWT.CENTER, 70); - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.MODEL, SWT.CENTER, 70); - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.SPEED, SWT.CENTER, 70); - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.IP_ADDRESS, SWT.CENTER, 100); - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.NETMASK, SWT.CENTER, 70); - setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.GATEWAY, SWT.CENTER, 70); - // setColumnProperties(table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES.PREFERRED, SWT.CENTER, 70); - } - - /** - * Sets properties for alignment and weight of given column of given table - * - * @param table - * @param columnIndex - * @param alignment - * @param weight - */ - public void setColumnProperties(Table table, NETWORK_INTERFACE_TABLE_COLUMN_INDICES columnIndex, int alignment, - int weight) { - TableColumn column = table.getColumn(columnIndex.ordinal()); - column.setAlignment(alignment); - - TableColumnLayout tableColumnLayout = (TableColumnLayout) table.getParent().getLayout(); - tableColumnLayout.setColumnData(column, new ColumnWeightData(weight)); - } - - private TableViewer createNetworkInterfacesTableViewer(final Composite parent, GlusterServer server) { - TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI); - // TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI); - tableViewer.setLabelProvider(new NetworkInterfaceTableLabelProvider()); - tableViewer.setContentProvider(new ArrayContentProvider()); - - setupNetworkInterfaceTable(parent, tableViewer.getTable()); - tableViewer.setInput(server.getNetworkInterfaces().toArray()); - - return tableViewer; - } - - private Composite createTableViewerComposite(Composite parent) { - Composite tableViewerComposite = new Composite(parent, SWT.NO); - tableViewerComposite.setLayout(new FillLayout(SWT.HORIZONTAL)); - GridData tableLayoutData = new GridData(SWT.FILL, SWT.FILL, true, false); - tableLayoutData.widthHint = 400; - tableLayoutData.minimumWidth = 400; - // tableLayoutData.grabExcessHorizontalSpace = true; - tableViewerComposite.setLayoutData(tableLayoutData); - return tableViewerComposite; - } - - private Composite createNetworkInterfacesSection(GlusterServer server, FormToolkit toolkit, ScrolledForm form) { - final Composite section = guiHelper.createSection(form, toolkit, "Network Interfaces", null, 1, false); - createNetworkInterfacesTableViewer(createTableViewerComposite(section), server); - // Hyperlink changePreferredNetworkLink = toolkit.createHyperlink(section, "Change Preferred Network", - // SWT.NONE); - // changePreferredNetworkLink.addHyperlinkListener(new HyperlinkAdapter() { - // - // @Override - // public void linkActivated(HyperlinkEvent e) { - // new MessageDialog( - // section.getShell(), - // "Gluster Storage Platform", - // guiHelper.getImage(IImageKeys.SERVER), - // "This will show additional controls to help user choose a new network interface. TO BE IMPLEMENTED.", - // MessageDialog.INFORMATION, new String[] { "OK" }, 0).open(); - // } - // }); - return section; - } - - private void createServerLogsTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit) { - String serverName = server.getName(); - Composite serverLogsTab = guiHelper.createTab(tabFolder, "Logs", IImageKeys.SERVER); - ServerLogsPage logsPage = new ServerLogsPage(serverLogsTab, SWT.NONE, server); - - serverLogsTab.layout(); // IMP: lays out the form properly - } - - private void createServerDisksTab(GlusterServer server, TabFolder tabFolder, FormToolkit toolkit, - IWorkbenchSite site) { - Composite serverDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.SERVER); - ServerDisksPage page = new ServerDisksPage(serverDisksTab, SWT.NONE, site, server.getDisks()); - - serverDisksTab.layout(); // IMP: lays out the form properly - } - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - GlusterServer server = (GlusterServer) entity; - - createServerSummaryTab(server, tabFolder, toolkit); - if (server.getStatus() == SERVER_STATUS.ONLINE) { - createServerDisksTab(server, tabFolder, toolkit, site); - createServerLogsTab(server, tabFolder, toolkit); - } - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java deleted file mode 100644 index 4e3d808a..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/PieChartViewerComposite.java +++ /dev/null @@ -1,261 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.eclipse.birt.chart.api.ChartEngine; -import org.eclipse.birt.chart.device.IDeviceRenderer; -import org.eclipse.birt.chart.device.IUpdateNotifier; -import org.eclipse.birt.chart.exception.ChartException; -import org.eclipse.birt.chart.factory.GeneratedChartState; -import org.eclipse.birt.chart.factory.Generator; -import org.eclipse.birt.chart.model.Chart; -import org.eclipse.birt.chart.model.ChartWithoutAxes; -import org.eclipse.birt.chart.model.attribute.Bounds; -import org.eclipse.birt.chart.model.attribute.ChartDimension; -import org.eclipse.birt.chart.model.attribute.impl.BoundsImpl; -import org.eclipse.birt.chart.model.attribute.impl.ColorDefinitionImpl; -import org.eclipse.birt.chart.model.component.Series; -import org.eclipse.birt.chart.model.component.impl.SeriesImpl; -import org.eclipse.birt.chart.model.data.NumberDataSet; -import org.eclipse.birt.chart.model.data.SeriesDefinition; -import org.eclipse.birt.chart.model.data.TextDataSet; -import org.eclipse.birt.chart.model.data.impl.NumberDataSetImpl; -import org.eclipse.birt.chart.model.data.impl.SeriesDefinitionImpl; -import org.eclipse.birt.chart.model.data.impl.TextDataSetImpl; -import org.eclipse.birt.chart.model.impl.ChartWithoutAxesImpl; -import org.eclipse.birt.chart.model.layout.Legend; -import org.eclipse.birt.chart.model.layout.Plot; -import org.eclipse.birt.chart.model.type.PieSeries; -import org.eclipse.birt.chart.model.type.impl.PieSeriesImpl; -import org.eclipse.birt.core.framework.PlatformConfig; -import org.eclipse.core.runtime.Platform; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.GC; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; - -import com.gluster.storage.management.gui.utils.GlusterChartPalette; - -/** - * - */ -public final class PieChartViewerComposite extends Composite implements - PaintListener, IUpdateNotifier { - - private IDeviceRenderer deviceReader = null; - private Chart chart = null; - private GeneratedChartState generatedChartState = null; - private boolean needsGeneration = true; - - private static Logger logger = Logger - .getLogger(PieChartViewerComposite.class.getName()); - - /** - * @param parent - * Parent composite of this pie chart viewer composite - * @param style - * SWT style to be used - * @param categories - * Categories of the pie chart - * @param values - * Values of each category in the pie chart Constructs a pie - * chart viewer composite for given categories and values - */ - public PieChartViewerComposite(Composite parent, int style, String[] categories, - Double[] values) { - super(parent, style); - try { - PlatformConfig config = new PlatformConfig(); - config.setBIRTHome(Platform.getInstallLocation().getURL().getPath()); - // Get the connection with SWT device to render the graphics. - deviceReader = ChartEngine.instance(config).getRenderer("dv.SWT");//$NON-NLS-1$ - } catch (ChartException ex) { - logger.log(Level.SEVERE, "Could not create Chart Renderer for SWT", - ex); - } - - addControlListener(new ControlListener() { - - public void controlMoved(ControlEvent e) { - needsGeneration = true; - } - - public void controlResized(ControlEvent e) { - needsGeneration = true; - } - }); - - chart = createPieChart(categories, values); - addPaintListener(this); - } - - /** - * @param categories - * Categories of the pie chart - * @param values - * Values of each category in the pie chart - * @return The chart object created for given categories and values - */ - public static final Chart createPieChart(String[] categories, - Double[] values) { - ChartWithoutAxes pieChart = ChartWithoutAxesImpl.create(); - - // Plot - pieChart.setSeriesThickness(10); - pieChart.setDimension(ChartDimension.TWO_DIMENSIONAL_WITH_DEPTH_LITERAL); - pieChart.getBlock().setBackground(ColorDefinitionImpl.WHITE()); - Plot p = pieChart.getPlot(); - - p.getClientArea().setBackground(null); - p.getClientArea().getOutline().setVisible(false); - p.getOutline().setVisible(false); - - // Legend - Legend lg = pieChart.getLegend(); - lg.setMaxPercent(0.7); - lg.getText().getFont().setSize(9); - lg.setBackground(null); - lg.getOutline().setVisible(false); - lg.setVisible(true); - - // Title - pieChart.getTitle().getLabel().getCaption().setValue("Pie Chart");//$NON-NLS-1$ - pieChart.getTitle().getOutline().setVisible(false); - pieChart.getTitle().setVisible(false); - - TextDataSet categoryValues = TextDataSetImpl.create(categories); - NumberDataSet seriesOneValues = NumberDataSetImpl.create(values); - - // Base Series - Series seCategory = SeriesImpl.create(); - seCategory.setDataSet(categoryValues); - - SeriesDefinition sd = SeriesDefinitionImpl.create(); - pieChart.getSeriesDefinitions().add(sd); - sd.setSeriesPalette(new GlusterChartPalette()); - sd.getSeriesPalette().shift(0); - sd.getSeries().add(seCategory); - - // Orthogonal Series - PieSeries sePie = (PieSeries) PieSeriesImpl.create(); - sePie.setRatio(0.60); - sePie.setDataSet(seriesOneValues); - sePie.setSeriesIdentifier("Chart");//$NON-NLS-1$ - sePie.getTitle().setVisible(false); // no title - sePie.getLabel().setVisible(false); // no label (values) - sePie.setExplosion(0); // no gap between the pie slices - - SeriesDefinition seriesDefinition = SeriesDefinitionImpl.create(); - seriesDefinition.getQuery().setDefinition("query.definition");//$NON-NLS-1$ - sd.getSeriesDefinitions().add(seriesDefinition); - seriesDefinition.getSeries().add(sePie); - - return pieChart; - } - - /* - * (non-Javadoc) - * - * @see - * org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events - * .PaintEvent) - */ - public final void paintControl(PaintEvent e) { - Rectangle d = ((Composite) e.getSource()).getBounds(); - Image imgChart = new Image(this.getDisplay(), d); - GC gcImage = new GC(imgChart); - deviceReader.setProperty(IDeviceRenderer.GRAPHICS_CONTEXT, gcImage); - deviceReader.setProperty(IDeviceRenderer.UPDATE_NOTIFIER, this); - - Bounds bo = BoundsImpl.create(0, 0, d.width, d.height); - bo.scale(58d / deviceReader.getDisplayServer().getDpiResolution()); - - Generator gr = Generator.instance(); - if (needsGeneration) { - needsGeneration = false; - try { - generatedChartState = gr.build(deviceReader.getDisplayServer(), - chart, bo, null, null, null); - } catch (ChartException ce) { - ce.printStackTrace(); - } - } - - try { - gr.render(deviceReader, generatedChartState); - GC gc = e.gc; - gc.drawImage(imgChart, d.x, d.y); - } catch (ChartException gex) { - logger.log(Level.SEVERE, "Exception while rendering pie chart [" - + gex.getMessage() + "]", gex); - } - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.birt.chart.device.IUpdateNotifier#getDesignTimeModel() - */ - public Chart getDesignTimeModel() { - return chart; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.birt.chart.device.IUpdateNotifier#getRunTimeModel() - */ - public Chart getRunTimeModel() { - return generatedChartState.getChartModel(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.birt.chart.device.IUpdateNotifier#peerInstance() - */ - public Object peerInstance() { - return this; - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.birt.chart.device.IUpdateNotifier#regenerateChart() - */ - public void regenerateChart() { - redraw(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.birt.chart.device.IUpdateNotifier#repaintChart() - */ - public void repaintChart() { - redraw(); - } -} \ No newline at end of file diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java deleted file mode 100644 index d634253e..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/ServerTabCreator.java +++ /dev/null @@ -1,73 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.utils.NumberUtil; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.TabCreator; - -public class ServerTabCreator implements TabCreator { - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - private void createServerSummarySection(Server server, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Summary", null, 2, false); - - toolkit.createLabel(section, "Number of CPUs: ", SWT.NONE); - toolkit.createLabel(section, "" + server.getNumOfCPUs(), SWT.NONE); - -// toolkit.createLabel(section, "CPU Usage (%): ", SWT.NONE); -// toolkit.createLabel(section, "" + server.getCpuUsage(), SWT.NONE); - - toolkit.createLabel(section, "Total Memory (GB): ", SWT.NONE); - toolkit.createLabel(section, "" + server.getTotalMemory(), SWT.NONE); - -// toolkit.createLabel(section, "Memory in Use (GB): ", SWT.NONE); -// toolkit.createLabel(section, "" + server.getMemoryInUse(), SWT.NONE); - - toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE); - toolkit.createLabel(section, "" + NumberUtil.formatNumber(server.getTotalDiskSpace()), SWT.NONE); - -// toolkit.createLabel(section, "Disk Space in Use (GB): ", SWT.NONE); -// toolkit.createLabel(section, "" + server.getDiskSpaceInUse(), SWT.NONE); - } - - private void createServerSummaryTab(Server server, TabFolder tabFolder, FormToolkit toolkit) { - String serverName = server.getName(); - Composite serverSummaryTab = guiHelper.createTab(tabFolder, serverName, IImageKeys.SERVER); - final ScrolledForm form = guiHelper.setupForm(serverSummaryTab, toolkit, "Discovered Server Summary [" + serverName + "]"); - createServerSummarySection(server, toolkit, form); - - serverSummaryTab.layout(); // IMP: lays out the form properly - } - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createServerSummaryTab((Server) entity, tabFolder, toolkit); - } -} diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java deleted file mode 100644 index dc3186e1..00000000 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/VolumeTabCreator.java +++ /dev/null @@ -1,270 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2011 Gluster, Inc. - * This file is part of Gluster Management Console. - * - * Gluster Management Console is free software; you can redistribute it and/or - * modify it under the terms of the GNU Affero General Public License as published - * by the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * Gluster Management Console 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 Affero General Public License - * for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see - * . - *******************************************************************************/ -package com.gluster.storage.management.gui.views.details.tabcreators; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.CLabel; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.TabFolder; -import org.eclipse.swt.widgets.Text; -import org.eclipse.ui.IWorkbenchSite; -import org.eclipse.ui.forms.events.HyperlinkAdapter; -import org.eclipse.ui.forms.events.HyperlinkEvent; -import org.eclipse.ui.forms.widgets.FormToolkit; -import org.eclipse.ui.forms.widgets.Hyperlink; -import org.eclipse.ui.forms.widgets.ScrolledForm; - -import com.gluster.storage.management.client.GlusterDataModelManager; -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.core.model.Volume.NAS_PROTOCOL; -import com.gluster.storage.management.core.model.Volume.VOLUME_TYPE; -import com.gluster.storage.management.core.utils.NumberUtil; -import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.details.BricksPage; -import com.gluster.storage.management.gui.views.details.DisksPage; -import com.gluster.storage.management.gui.views.details.TabCreator; -import com.gluster.storage.management.gui.views.details.VolumeLogsPage; -import com.gluster.storage.management.gui.views.details.VolumeOptionsPage; - -public class VolumeTabCreator implements TabCreator { - private static final GUIHelper guiHelper = GUIHelper.getInstance(); - - private void createVolumePropertiesSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Properties", null, 3, false); - - createVolumeTypeField(volume, toolkit, section); - - VOLUME_TYPE volumeType = volume.getVolumeType(); - if (volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) { - createReplicaCountField(volume, toolkit, section); - } - - if (volumeType == VOLUME_TYPE.DISTRIBUTED_STRIPE) { - createStripeCountField(volume, toolkit, section); - } - - createNumOfDisksField(volume, toolkit, section); - createDiskSpaceField(volume, toolkit, section); - createTransportTypeField(volume, toolkit, section); - createNASProtocolField(volume, toolkit, section); - createAccessControlField(volume, toolkit, section); - createStatusField(volume, toolkit, section); - } - - private void createDiskSpaceField(final Volume volume, FormToolkit toolkit, Composite section) { - Label diskSpaceLabel = toolkit.createLabel(section, "Total Disk Space (GB): ", SWT.NONE); - diskSpaceLabel.setToolTipText("boldnormal"); - toolkit.createLabel(section, "" + NumberUtil.formatNumber(volume.getTotalDiskSpace()), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createStatusField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Status: ", SWT.NONE); - - CLabel lblStatusValue = new CLabel(section, SWT.NONE); - lblStatusValue.setText(volume.getStatusStr()); - lblStatusValue.setImage(volume.getStatus() == Volume.VOLUME_STATUS.ONLINE ? guiHelper - .getImage(IImageKeys.STATUS_ONLINE) : guiHelper.getImage(IImageKeys.STATUS_OFFLINE)); - - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createTransportTypeField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Transport Type: ", SWT.NONE); - toolkit.createLabel(section, "" + volume.getTransportTypeStr(), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createNumOfDisksField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Number of Disks: ", SWT.NONE); - toolkit.createLabel(section, "" + volume.getNumOfDisks(), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createStripeCountField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Stripe Count: ", SWT.NONE); - toolkit.createLabel(section, "" + volume.getStripeCount(), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createReplicaCountField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Replica Count: ", SWT.NONE); - toolkit.createLabel(section, "" + volume.getReplicaCount(), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); // dummy - } - - private void createVolumeTypeField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Volume Type: ", SWT.NONE); - toolkit.createLabel(section, volume.getVolumeTypeStr(), SWT.NONE); - toolkit.createLabel(section, "", SWT.NONE); - } - - private void createVolumeAlertsSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 3, false); - toolkit.createLabel(section, "Volume related alerts will be displayed here"); - } - - private void createVolumeMountingInfoSection(final Volume volume, FormToolkit toolkit, final ScrolledForm form) { - Composite section = guiHelper.createSection(form, toolkit, "Mounting Information", null, 3, false); - toolkit.createLabel(section, "Information about mounting the\nvolume will be printed here"); - } - - private GridData createDefaultLayoutData() { - GridData layoutData = new GridData(); - layoutData.minimumWidth = 150; - layoutData.widthHint = 150; - return layoutData; - } - - private void createAccessControlField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "Access Control: ", SWT.NONE); - Text accessControlText = toolkit.createText(section, volume.getAccessControlList()); - accessControlText.setLayoutData(createDefaultLayoutData()); - accessControlText.setEnabled(false); - createChangeLinkForAccessControl(volume, toolkit, section, accessControlText); - } - - private void createChangeLinkForAccessControl(final Volume volume, FormToolkit toolkit, Composite section, - final Text accessControlText) { - final Hyperlink changeLink = toolkit.createHyperlink(section, "change", SWT.NONE); - changeLink.addHyperlinkListener(new HyperlinkAdapter() { - - private void finishEdit() { - // TODO: Update value to back-end - // TODO: Validation of entered text - volume.setAccessControlList(accessControlText.getText()); - accessControlText.setEnabled(false); - changeLink.setText("change"); - } - - private void startEdit() { - accessControlText.setEnabled(true); - changeLink.setText("update"); - } - - @Override - public void linkActivated(HyperlinkEvent e) { - if (accessControlText.isEnabled()) { - // we were already in edit mode. - finishEdit(); - } else { - // Get in to edit mode - startEdit(); - } - } - }); - } - - private void createNASProtocolField(final Volume volume, FormToolkit toolkit, Composite section) { - toolkit.createLabel(section, "NAS Protocols: ", SWT.NONE); - - Composite nasProtocolsComposite = toolkit.createComposite(section); - nasProtocolsComposite.setLayout(new FillLayout()); - - createCheckbox(toolkit, nasProtocolsComposite, "Gluster", true); - final Button nfsCheckBox = createCheckbox(toolkit, nasProtocolsComposite, "NFS", volume.getNASProtocols().contains(NAS_PROTOCOL.NFS)); - - createChangeLinkForNASProtocol(volume, toolkit, section, nfsCheckBox); - } - - private void createChangeLinkForNASProtocol(final Volume volume, FormToolkit toolkit, Composite section, - final Button nfsCheckBox) { - final Hyperlink changeLink = toolkit.createHyperlink(section, "change", SWT.NONE); - changeLink.addHyperlinkListener(new HyperlinkAdapter() { - - private void finishEdit() { - // TODO: Update value to back-end - if (nfsCheckBox.getSelection()) { - volume.enableNFS(); - } else { - volume.disableNFS(); - } - nfsCheckBox.setEnabled(false); - changeLink.setText("change"); - } - - private void startEdit() { - nfsCheckBox.setEnabled(true); - changeLink.setText("update"); - } - - @Override - public void linkActivated(HyperlinkEvent e) { - if (nfsCheckBox.isEnabled()) { - // we were already in edit mode. - finishEdit(); - } else { - // Get in to edit mode - startEdit(); - } - } - }); - } - - private Button createCheckbox(FormToolkit toolkit, Composite parent, String label, boolean selected) { - final Button checkBox = toolkit.createButton(parent, label, SWT.CHECK); - checkBox.setEnabled(false); - checkBox.setSelection(selected); - return checkBox; - } - - private void createVolumePropertiesTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) { - Composite volumeTab = guiHelper.createTab(tabFolder, volume.getName() + " - Properties", IImageKeys.VOLUME); - final ScrolledForm form = guiHelper.setupForm(volumeTab, toolkit, "Volume Properties [" + volume.getName() + "]"); - createVolumePropertiesSection(volume, toolkit, form); - createVolumeMountingInfoSection(volume, toolkit, form); - createVolumeAlertsSection(volume, toolkit, form); - - volumeTab.layout(); // IMP: lays out the form properly - } - - private void createVolumeLogsTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) { - Composite volumeTab = guiHelper.createTab(tabFolder, "Logs", IImageKeys.VOLUME); - VolumeLogsPage logsPage = new VolumeLogsPage(volumeTab, SWT.NONE, volume); - - volumeTab.layout(); // IMP: lays out the form properly - } - - private void createVolumeDisksTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - Composite volumeDisksTab = guiHelper.createTab(tabFolder, "Disks", IImageKeys.VOLUME); - BricksPage page = new BricksPage(volumeDisksTab, SWT.NONE, site, GlusterDataModelManager.getInstance().getOnlineBricks(volume)); - volumeDisksTab.layout(); // IMP: lays out the form properly - } - - private void createVolumeOptionsTab(Volume volume, TabFolder tabFolder, FormToolkit toolkit) { - Composite volumeTab = guiHelper.createTab(tabFolder, "Options", IImageKeys.VOLUME); - //VolumeOptionsPage page = new VolumeOptionsPage(volumeTab, SWT.NONE, volume); - - volumeTab.layout(); // IMP: lays out the form properly - } - - @Override - public void createTabs(Entity entity, TabFolder tabFolder, FormToolkit toolkit, IWorkbenchSite site) { - createVolumePropertiesTab((Volume) entity, tabFolder, toolkit); - createVolumeDisksTab((Volume) entity, tabFolder, toolkit, site); - createVolumeOptionsTab((Volume) entity, tabFolder, toolkit); - createVolumeLogsTab((Volume) entity, tabFolder, toolkit); - } -} -- cgit