From 8ed9d4b9984bde08cd0761c1fd398c546cbb1e37 Mon Sep 17 00:00:00 2001 From: Shireesh Anjal Date: Sat, 19 Mar 2011 22:10:11 +0530 Subject: Converting tabs to views.. continued. --- .../storage/management/gui/Perspective.java | 2 +- .../storage/management/gui/utils/GUIHelper.java | 2 +- .../storage/management/gui/views/DetailsView.java | 1 - .../gui/views/DiscoveredServersView.java | 1 - .../management/gui/views/NavigationView.java | 160 ++++++++++++++ .../management/gui/views/VolumeDisksView.java | 39 ++++ .../management/gui/views/VolumeLogsView.java | 35 +++ .../management/gui/views/VolumeOptionsView.java | 36 ++++ .../management/gui/views/VolumeSummaryView.java | 237 +++++++++++++++++++++ .../management/gui/views/VolumesSummaryView.java | 18 +- .../storage/management/gui/views/VolumesView.java | 1 - .../EntityGroupGlusterServerTabCreator.java | 2 +- .../tabcreators/EntityGroupServerTabCreator.java | 2 +- .../tabcreators/EntityGroupVolumeTabCreator.java | 2 +- .../gui/views/navigator/NavigationView.java | 162 -------------- 15 files changed, 521 insertions(+), 179 deletions(-) create mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java create mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java create mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeLogsView.java create mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeOptionsView.java create mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java delete mode 100644 com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java (limited to 'com.gluster.storage.management.gui/src/com/gluster/storage') diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Perspective.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Perspective.java index a8eb836b..3f8702ce 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Perspective.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/Perspective.java @@ -22,7 +22,7 @@ import org.eclipse.ui.IPageLayout; import org.eclipse.ui.IPerspectiveFactory; import com.gluster.storage.management.gui.views.DetailsView; -import com.gluster.storage.management.gui.views.navigator.NavigationView; +import com.gluster.storage.management.gui.views.NavigationView; public class Perspective implements IPerspectiveFactory { diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java index e77e3a65..ccd5d8ec 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java @@ -68,7 +68,7 @@ import org.eclipse.ui.forms.widgets.Section; import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.core.model.EntityGroup; import com.gluster.storage.management.gui.IImageKeys; -import com.gluster.storage.management.gui.views.navigator.NavigationView; +import com.gluster.storage.management.gui.views.NavigationView; public class GUIHelper { private static final GUIHelper instance = new GUIHelper(); diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DetailsView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DetailsView.java index a19621dd..df2f495e 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DetailsView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DetailsView.java @@ -38,7 +38,6 @@ import com.gluster.storage.management.core.model.Entity; import com.gluster.storage.management.gui.toolbar.ToolbarManager; import com.gluster.storage.management.gui.views.details.TabCreatorFactory; import com.gluster.storage.management.gui.views.details.TabCreatorFactoryImpl; -import com.gluster.storage.management.gui.views.navigator.NavigationView; /** * This view is displayed on the right hand side of the platform UI. It updates itself with appropriate tabs diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServersView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServersView.java index 5fa6771b..69c506f4 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServersView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/DiscoveredServersView.java @@ -34,7 +34,6 @@ 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.utils.GUIHelper; -import com.gluster.storage.management.gui.views.navigator.NavigationView; import com.gluster.storage.management.gui.views.pages.ServersPage; /** diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java new file mode 100644 index 00000000..65c1d3ea --- /dev/null +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/NavigationView.java @@ -0,0 +1,160 @@ +/******************************************************************************* + * 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; + +import org.eclipse.core.runtime.IAdapterFactory; +import org.eclipse.core.runtime.Platform; +import org.eclipse.jface.action.MenuManager; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeSelection; +import org.eclipse.jface.viewers.TreeViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Menu; +import org.eclipse.ui.ISelectionListener; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IViewReference; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.model.BaseWorkbenchContentProvider; +import org.eclipse.ui.model.WorkbenchLabelProvider; +import org.eclipse.ui.part.ViewPart; + +import com.gluster.storage.management.client.GlusterDataModelManager; +import com.gluster.storage.management.core.model.Cluster; +import com.gluster.storage.management.core.model.DefaultClusterListener; +import com.gluster.storage.management.core.model.Entity; +import com.gluster.storage.management.core.model.EntityGroup; +import com.gluster.storage.management.core.model.GlusterDataModel; +import com.gluster.storage.management.core.model.GlusterServer; +import com.gluster.storage.management.core.model.Server; +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.toolbar.ToolbarManager; +import com.gluster.storage.management.gui.views.navigator.ClusterAdapterFactory; + +public class NavigationView extends ViewPart implements ISelectionListener { + public static final String ID = NavigationView.class.getName(); + private GlusterDataModel model; + private TreeViewer treeViewer; + private IAdapterFactory adapterFactory = new ClusterAdapterFactory(); + private ToolbarManager toolbarManager; + private Entity entity; + + public NavigationView() { + super(); + } + + @Override + public void createPartControl(Composite parent) { + model = GlusterDataModelManager.getInstance().getModel(); + + treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); + Platform.getAdapterManager().registerAdapters(adapterFactory, Entity.class); + treeViewer.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); + treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); + treeViewer.setInput(model); + treeViewer.expandAll(); + // select the first element by default + treeViewer.setSelection(new StructuredSelection(model.getChildren().get(0))); + + MenuManager menuManager = new MenuManager("&Gluster", "gluster.context.menu"); + Menu contextMenu = menuManager.createContextMenu(treeViewer.getControl()); + treeViewer.getTree().setMenu(contextMenu); + + getSite().registerContextMenu(menuManager, treeViewer); + + GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() { + @Override + public void serverAdded(GlusterServer server) { + treeViewer.refresh(); + } + }); + + getSite().setSelectionProvider(treeViewer); + getSite().getPage().addSelectionListener(this); + // Create the toolbar manager + toolbarManager = new ToolbarManager(getSite().getWorkbenchWindow()); + } + + public void selectEntity(Entity entity) { + treeViewer.setSelection(new StructuredSelection(entity)); + treeViewer.reveal(entity); + setFocus(); // this ensures that the "selection changed" event gets fired + } + + @Override + public void setFocus() { + treeViewer.getControl().setFocus(); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, + * org.eclipse.jface.viewers.ISelection) + */ + @Override + public void selectionChanged(IWorkbenchPart part, ISelection selection) { + + if (part instanceof NavigationView && selection instanceof TreeSelection) { + Entity selectedEntity = (Entity) ((TreeSelection) selection).getFirstElement(); + + if (entity == selectedEntity || selectedEntity == null) { + // entity selection has not changed. do nothing. + return; + } + + IViewReference[] viewReferences = getSite().getPage().getViewReferences(); + for (final IViewReference viewReference : viewReferences) { + if (!viewReference.getId().equals(ID)) { + getSite().getPage().hideView(viewReference); + } + } + + entity = selectedEntity; + IWorkbenchPage page = getSite().getPage(); + try { + if (entity instanceof EntityGroup) { + if ((((EntityGroup) entity).getEntityType()) == Server.class) { + page.showView(DiscoveredServersView.ID); + } else if ((((EntityGroup) entity).getEntityType()) == Volume.class) { + page.showView(VolumesSummaryView.ID); + page.showView(VolumesView.ID, null, IWorkbenchPage.VIEW_CREATE); + } + } else if (entity.getClass() == Server.class) { + page.showView(DiscoveredServerView.ID); + } else if (entity instanceof Volume) { + page.showView(VolumeSummaryView.ID); + page.showView(VolumeDisksView.ID, null, IWorkbenchPage.VIEW_CREATE); + page.showView(VolumeOptionsView.ID, null, IWorkbenchPage.VIEW_CREATE); + page.showView(VolumeLogsView.ID, null, IWorkbenchPage.VIEW_CREATE); + } else if (entity instanceof Cluster) { + page.showView(ClusterSummaryView.ID); + } + } catch (PartInitException e) { + e.printStackTrace(); + } + + // update toolbar buttons visibility based on selected entity + toolbarManager.updateToolbar(entity); + } + } +} diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java new file mode 100644 index 00000000..cbf6736b --- /dev/null +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeDisksView.java @@ -0,0 +1,39 @@ +package com.gluster.storage.management.gui.views; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.utils.GUIHelper; +import com.gluster.storage.management.gui.views.details.DisksPage; + +public class VolumeDisksView extends ViewPart { + public static final String ID = VolumeDisksView.class.getName(); + private static final GUIHelper guiHelper = GUIHelper.getInstance(); + private DisksPage page; + private Volume volume; + + @Override + public void createPartControl(Composite parent) { + if (volume == null) { + volume = (Volume) guiHelper.getSelectedEntity(getSite(), Volume.class); + } + + createPage(parent); + } + + /** + * @param parent + */ + private void createPage(Composite parent) { + page = new DisksPage(parent, SWT.NONE, getSite(), volume.getDisks()); + parent.layout(); // IMP: lays out the form properly + } + + @Override + public void setFocus() { + page.setFocus(); + } +} + diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeLogsView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeLogsView.java new file mode 100644 index 00000000..b6c98ad3 --- /dev/null +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeLogsView.java @@ -0,0 +1,35 @@ +package com.gluster.storage.management.gui.views; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.utils.GUIHelper; +import com.gluster.storage.management.gui.views.details.VolumeLogsPage; + +public class VolumeLogsView extends ViewPart { + VolumeLogsPage logsPage; + public static final String ID = VolumeLogsView.class.getName(); + private static final GUIHelper guiHelper = GUIHelper.getInstance(); + private Volume volume; + + @Override + public void createPartControl(Composite parent) { + if (volume == null) { + volume = (Volume) guiHelper.getSelectedEntity(getSite(), Volume.class); + } + + createPage(parent); + } + + private void createPage(Composite parent) { + logsPage = new VolumeLogsPage(parent, SWT.NONE, volume); + parent.layout(); // IMP: lays out the form properly + } + + @Override + public void setFocus() { + logsPage.setFocus(); + } +} \ No newline at end of file diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeOptionsView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeOptionsView.java new file mode 100644 index 00000000..e8695737 --- /dev/null +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeOptionsView.java @@ -0,0 +1,36 @@ +package com.gluster.storage.management.gui.views; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.part.ViewPart; + +import com.gluster.storage.management.core.model.Volume; +import com.gluster.storage.management.gui.utils.GUIHelper; +import com.gluster.storage.management.gui.views.details.VolumeOptionsPage; + +public class VolumeOptionsView extends ViewPart { + public static final String ID = VolumeOptionsView.class.getName(); + private static final GUIHelper guiHelper = GUIHelper.getInstance(); + private VolumeOptionsPage page; + private Volume volume; + + @Override + public void createPartControl(Composite parent) { + if (volume == null) { + volume = (Volume) guiHelper.getSelectedEntity(getSite(), Volume.class); + } + + createPage(parent); + } + + private void createPage(Composite parent) { + page = new VolumeOptionsPage(parent, SWT.NONE, volume); + parent.layout(); // IMP: lays out the form properly + } + + @Override + public void setFocus() { + page.setFocus(); + } +} + diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java new file mode 100644 index 00000000..99ac0e0b --- /dev/null +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumeSummaryView.java @@ -0,0 +1,237 @@ +package com.gluster.storage.management.gui.views; + +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.Display; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Text; +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 org.eclipse.ui.part.ViewPart; + +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; + +public class VolumeSummaryView extends ViewPart { + public static final String ID = VolumeSummaryView.class.getName(); + private static final GUIHelper guiHelper = GUIHelper.getInstance(); + private final FormToolkit toolkit = new FormToolkit(Display.getCurrent()); + private ScrolledForm form; + private Volume volume; + + @Override + public void createPartControl(Composite parent) { + if (volume == null) { + volume = (Volume) guiHelper.getSelectedEntity(getSite(), Volume.class); + } + + createSections(parent); + } + + private void createSections(Composite parent) { + form = guiHelper.setupForm(parent, toolkit, "Volume Properties [" + volume.getName() + "]"); + + createVolumePropertiesSection(); + createVolumeMountingInfoSection(); + createVolumeAlertsSection(); + + parent.layout(); // IMP: lays out the form properly + } + + private void createVolumeAlertsSection() { + Composite section = guiHelper.createSection(form, toolkit, "Alerts", null, 3, false); + toolkit.createLabel(section, "Volume related alerts will be displayed here"); + } + + private void createVolumeMountingInfoSection() { + Composite section = guiHelper.createSection(form, toolkit, "Mounting Information", null, 3, false); + toolkit.createLabel(section, "Information about mounting the\nvolume will be printed here"); + } + + /** + * + */ + private void createVolumePropertiesSection() { + Composite section = guiHelper.createSection(form, toolkit, "Properties", null, 3, false); + + createVolumeTypeField(section); + + VOLUME_TYPE volumeType = volume.getVolumeType(); + if (volumeType == VOLUME_TYPE.DISTRIBUTED_MIRROR) { + createReplicaCountField(section); + } + + if (volumeType == VOLUME_TYPE.DISTRIBUTED_STRIPE) { + createStripeCountField(section); + } + + createNumOfDisksField(section); + createDiskSpaceField(section); + createTransportTypeField(section); + createNASProtocolField(section); + createAccessControlField(section); + createStatusField(section); + } + + private GridData createDefaultLayoutData() { + GridData layoutData = new GridData(); + layoutData.minimumWidth = 150; + layoutData.widthHint = 150; + return layoutData; + } + + private void createAccessControlField(Composite section) { + toolkit.createLabel(section, "Access Control: ", SWT.NONE); + Text accessControlText = toolkit.createText(section, volume.getAccessControlList()); + accessControlText.setLayoutData(createDefaultLayoutData()); + accessControlText.setEnabled(false); + createChangeLinkForAccessControl(section, accessControlText); + } + + private void createChangeLinkForAccessControl(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(Composite section) { + toolkit.createLabel(section, "NAS Protocols: ", SWT.NONE); + + Composite nasProtocolsComposite = toolkit.createComposite(section); + nasProtocolsComposite.setLayout(new FillLayout()); + + createCheckbox(nasProtocolsComposite, "Gluster", true); + final Button nfsCheckBox = createCheckbox(nasProtocolsComposite, "NFS", + volume.getNASProtocols().contains(NAS_PROTOCOL.NFS)); + + createChangeLinkForNASProtocol(section, nfsCheckBox); + } + + private Button createCheckbox(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 createChangeLinkForNASProtocol(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 void createDiskSpaceField(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(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(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(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(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(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(Composite section) { + toolkit.createLabel(section, "Volume Type: ", SWT.NONE); + toolkit.createLabel(section, volume.getVolumeTypeStr(), SWT.NONE); + toolkit.createLabel(section, "", SWT.NONE); + } + + @Override + public void setFocus() { + form.setFocus(); + } +} diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java index 7686ed38..8b790181 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesSummaryView.java @@ -61,31 +61,31 @@ public class VolumesSummaryView extends ViewPart { } } - createSections(parent, volumes, toolkit); + createSections(parent); } - private void createSections(Composite parent, final EntityGroup volumes, FormToolkit toolkit) { - final ScrolledForm form = guiHelper.setupForm(parent, toolkit, "Volumes - Summary"); - createSummarySection(volumes, toolkit, form); - createRunningTasksSection(volumes, toolkit, form); - createAlertsSection(volumes, toolkit, form); + private void createSections(Composite parent) { + form = guiHelper.setupForm(parent, toolkit, "Volumes - Summary"); + createSummarySection(); + createRunningTasksSection(); + createAlertsSection(); parent.layout(); // IMP: lays out the form properly } - private void createAlertsSection(final EntityGroup volumes, FormToolkit toolkit, final ScrolledForm form) { + private void createAlertsSection() { 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) { + private void createRunningTasksSection() { 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) { + private void createSummarySection() { Composite section = guiHelper.createSection(form, toolkit, "Availability", null, 2, false); Double[] values = new Double[] { Double.valueOf(getVolumeCountByStatus(volumes, VOLUME_STATUS.ONLINE)), diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesView.java index 4768d2de..4ccf5325 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesView.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/VolumesView.java @@ -35,7 +35,6 @@ import com.gluster.storage.management.core.model.EntityGroup; import com.gluster.storage.management.core.model.Server; import com.gluster.storage.management.core.model.Volume; import com.gluster.storage.management.gui.utils.GUIHelper; -import com.gluster.storage.management.gui.views.navigator.NavigationView; import com.gluster.storage.management.gui.views.pages.ServersPage; import com.gluster.storage.management.gui.views.pages.VolumesPage; diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java index 89191f1a..3c94c3cc 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupGlusterServerTabCreator.java @@ -39,10 +39,10 @@ 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; -import com.gluster.storage.management.gui.views.navigator.NavigationView; public class EntityGroupGlusterServerTabCreator implements TabCreator, IDoubleClickListener { private static final GUIHelper guiHelper = GUIHelper.getInstance(); diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java index d7b78198..3f49ba6b 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupServerTabCreator.java @@ -32,8 +32,8 @@ 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.navigator.NavigationView; import com.gluster.storage.management.gui.views.pages.ServersPage; public class EntityGroupServerTabCreator implements TabCreator, IDoubleClickListener { diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java index 9ffea7af..22ffd94d 100644 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java +++ b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/tabcreators/EntityGroupVolumeTabCreator.java @@ -37,8 +37,8 @@ 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.navigator.NavigationView; import com.gluster.storage.management.gui.views.pages.VolumesPage; public class EntityGroupVolumeTabCreator implements TabCreator, IDoubleClickListener { diff --git a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java b/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java deleted file mode 100644 index 49102e6c..00000000 --- a/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/navigator/NavigationView.java +++ /dev/null @@ -1,162 +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.navigator; - -import org.eclipse.core.runtime.IAdapterFactory; -import org.eclipse.core.runtime.Platform; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.StructuredSelection; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.ui.ISelectionListener; -import org.eclipse.ui.IViewPart; -import org.eclipse.ui.IViewReference; -import org.eclipse.ui.IWorkbenchPart; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.model.BaseWorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.part.ViewPart; - -import com.gluster.storage.management.client.GlusterDataModelManager; -import com.gluster.storage.management.core.model.Cluster; -import com.gluster.storage.management.core.model.DefaultClusterListener; -import com.gluster.storage.management.core.model.Entity; -import com.gluster.storage.management.core.model.EntityGroup; -import com.gluster.storage.management.core.model.GlusterDataModel; -import com.gluster.storage.management.core.model.GlusterServer; -import com.gluster.storage.management.core.model.Server; -import com.gluster.storage.management.core.model.Volume; -import com.gluster.storage.management.gui.toolbar.ToolbarManager; -import com.gluster.storage.management.gui.views.ClusterSummaryView; -import com.gluster.storage.management.gui.views.DiscoveredServerView; -import com.gluster.storage.management.gui.views.DiscoveredServersView; -import com.gluster.storage.management.gui.views.VolumesSummaryView; -import com.gluster.storage.management.gui.views.VolumesView; - -public class NavigationView extends ViewPart implements ISelectionListener { - public static final String ID = NavigationView.class.getName(); - private GlusterDataModel model; - private TreeViewer treeViewer; - private IAdapterFactory adapterFactory = new ClusterAdapterFactory(); - private ToolbarManager toolbarManager; - private Entity entity; - - public NavigationView() { - super(); - } - - @Override - public void createPartControl(Composite parent) { - model = GlusterDataModelManager.getInstance().getModel(); - - treeViewer = new TreeViewer(parent, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL); - Platform.getAdapterManager().registerAdapters(adapterFactory, Entity.class); - treeViewer.setLabelProvider(WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider()); - treeViewer.setContentProvider(new BaseWorkbenchContentProvider()); - treeViewer.setInput(model); - treeViewer.expandAll(); - // select the first element by default - treeViewer.setSelection(new StructuredSelection(model.getChildren().get(0))); - - MenuManager menuManager = new MenuManager("&Gluster", "gluster.context.menu"); - Menu contextMenu = menuManager.createContextMenu(treeViewer.getControl()); - treeViewer.getTree().setMenu(contextMenu); - - getSite().registerContextMenu(menuManager, treeViewer); - - GlusterDataModelManager.getInstance().addClusterListener(new DefaultClusterListener() { - @Override - public void serverAdded(GlusterServer server) { - treeViewer.refresh(); - } - }); - - getSite().setSelectionProvider(treeViewer); - getSite().getPage().addSelectionListener(this); - // Create the toolbar manager - toolbarManager = new ToolbarManager(getSite().getWorkbenchWindow()); - } - - public void selectEntity(Entity entity) { - treeViewer.setSelection(new StructuredSelection(entity)); - treeViewer.reveal(entity); - setFocus(); // this ensures that the "selection changed" event gets fired - } - - @Override - public void setFocus() { - treeViewer.getControl().setFocus(); - } - - /* - * (non-Javadoc) - * - * @see org.eclipse.ui.ISelectionListener#selectionChanged(org.eclipse.ui.IWorkbenchPart, - * org.eclipse.jface.viewers.ISelection) - */ - @Override - public void selectionChanged(IWorkbenchPart part, ISelection selection) { - - if (part instanceof NavigationView && selection instanceof TreeSelection) { - Entity selectedEntity = (Entity) ((TreeSelection) selection).getFirstElement(); - - if (entity == selectedEntity || selectedEntity == null) { - // entity selection has not changed. do nothing. - return; - } - - IViewReference[] viewReferences = getSite().getPage().getViewReferences(); - for (final IViewReference viewReference : viewReferences) { - if (!viewReference.getId().equals(ID)) { - getSite().getPage().hideView(viewReference); - } - } - - entity = selectedEntity; - try { - if (entity instanceof EntityGroup) { - if ((((EntityGroup) entity).getEntityType()) == Server.class) { - getSite().getPage().showView(DiscoveredServersView.ID); - } else if ((((EntityGroup) entity).getEntityType()) == Volume.class) { - IViewPart summaryView = getSite().getPage().showView(VolumesSummaryView.ID); - getSite().getPage().showView(VolumesView.ID); - getSite().getPage().bringToTop(summaryView); - } - } else if (entity.getClass() == Server.class) { - getSite().getPage().showView(DiscoveredServerView.ID); - } else if (entity instanceof Cluster) { - try { - getSite().getPage().showView(ClusterSummaryView.ID); - } catch (RuntimeException e) { - // happens when navigation view is opening for the first time. just ignore it! - } - } - } catch (PartInitException e) { - e.printStackTrace(); - } - - // update toolbar buttons visibility based on selected entity - toolbarManager.updateToolbar(entity); - } - } -} -- cgit