summaryrefslogtreecommitdiffstats
path: root/src/com.gluster.storage.management.gui
diff options
context:
space:
mode:
authorShireesh Anjal <shireesh@gluster.com>2011-06-08 16:47:11 +0530
committerShireesh Anjal <shireesh@gluster.com>2011-06-08 16:47:11 +0530
commitc604f66c85de5fcda8ce36be22b34be06ad34704 (patch)
tree5f11e6983f313b68658687e5d71ade380fd9543f /src/com.gluster.storage.management.gui
parent76cb93060be51514c9fd1d54d68311eba448ad87 (diff)
add/remove servers
Diffstat (limited to 'src/com.gluster.storage.management.gui')
-rw-r--r--src/com.gluster.storage.management.gui/plugin.xml43
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java14
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java12
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java34
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersView.java2
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java59
-rw-r--r--src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java60
7 files changed, 139 insertions, 85 deletions
diff --git a/src/com.gluster.storage.management.gui/plugin.xml b/src/com.gluster.storage.management.gui/plugin.xml
index 82b7f3e0..89b2460b 100644
--- a/src/com.gluster.storage.management.gui/plugin.xml
+++ b/src/com.gluster.storage.management.gui/plugin.xml
@@ -666,22 +666,6 @@
toolbarPath="Normal"
tooltip="Create a new Volume">
</action>
- <action
- allowLabelUpdate="false"
- class="com.gluster.storage.management.gui.actions.AddServerAction"
- definitionId="com.gluster.storage.management.gui.commands.AddServer"
- icon="icons/server-add.png"
- id="com.gluster.storage.management.gui.actions.AddServerAction"
- label="Add &amp;Server(s)"
- menubarPath="com.gluster.storage.management.gui.menu.cluster/cluster"
- mode="FORCE_TEXT"
- pulldown="false"
- retarget="false"
- state="false"
- style="push"
- toolbarPath="Normal"
- tooltip="Add Server(s) to Cluster">
- </action>
<menu
id="com.gluster.storage.management.gui.menu.cluster"
label="&amp;Gluster">
@@ -711,22 +695,6 @@
toolbarPath="Normal"
tooltip="Remove Server(s)">
</action>
- <action
- allowLabelUpdate="false"
- class="com.gluster.storage.management.gui.actions.AddServerAction"
- definitionId="com.gluster.storage.management.gui.commands.AddServer"
- icon="icons/server-add.png"
- id="com.gluster.storage.management.gui.actions.AddServerAction"
- label="&amp;Add Server(s)"
- menubarPath="com.gluster.storage.management.gui.menu.servers/servers"
- mode="FORCE_TEXT"
- pulldown="false"
- retarget="false"
- state="false"
- style="push"
- toolbarPath="Normal"
- tooltip="Add Server(s) to Cluster">
- </action>
<menu
id="com.gluster.storage.management.gui.menu.servers"
label="&amp;Gluster"
@@ -747,7 +715,7 @@
definitionId="com.gluster.storage.management.gui.commands.RemoveServer"
icon="icons/server-remove.png"
id="com.gluster.storage.management.gui.actions.RemoveServerAction"
- label="&amp;Remove Server"
+ label="&amp;Remove Server(s)"
menubarPath="com.gluster.storage.management.gui.menu.glusterserver/glusterserver"
mode="FORCE_TEXT"
pulldown="false"
@@ -807,7 +775,7 @@
definitionId="com.gluster.storage.management.gui.commands.AddServer"
icon="icons/server-add.png"
id="com.gluster.storage.management.gui.actions.AddServerAction"
- label="&amp;Add Server"
+ label="&amp;Add Server(s)"
menubarPath="com.gluster.storage.management.gui.menu.discoveredserver/discoveredserver"
mode="FORCE_TEXT"
pulldown="false"
@@ -1101,7 +1069,7 @@
<action
class="com.gluster.storage.management.gui.actions.RemoveServerAction"
definitionId="com.gluster.storage.management.gui.commands.RemoveServer"
- enablesFor="1"
+ enablesFor="+"
icon="icons/server-remove.png"
id="com.gluster.storage.management.gui.actions.RemoveServerAction"
label="&amp;Remove Server"
@@ -1115,6 +1083,7 @@
allowLabelUpdate="false"
class="com.gluster.storage.management.gui.actions.MigrateDiskAction"
definitionId="com.gluster.storage.management.gui.commands.MigrateDisk"
+ enablesFor="1"
icon="icons/disk-migrate.png"
id="com.gluster.storage.management.gui.actions.MigrateDiskAction"
label="&amp;Migrate Disk"
@@ -1131,6 +1100,7 @@
allowLabelUpdate="false"
class="com.gluster.storage.management.gui.actions.DeleteVolumeAction"
definitionId="com.gluster.storage.management.gui.commands.DeleteVolume"
+ enablesFor="1"
icon="icons/volume-delete.png"
id="com.gluster.storage.management.gui.actions.DeleteVolumeAction"
label="&amp;Delete Volume"
@@ -1147,6 +1117,7 @@
allowLabelUpdate="false"
class="com.gluster.storage.management.gui.actions.RebalanceVolumeAction"
definitionId="com.gluster.storage.management.gui.commands.RebalanceVolume"
+ enablesFor="1"
icon="icons/volume-rebalance.png"
id="com.gluster.storage.management.gui.actions.RebalanceVolumeAction"
label="&amp;Rebalance Volume"
@@ -1163,6 +1134,7 @@
allowLabelUpdate="false"
class="com.gluster.storage.management.gui.actions.StopVolumeAction"
definitionId="com.gluster.storage.management.gui.commands.StopVolume"
+ enablesFor="+"
icon="icons/volume-stop.png"
id="com.gluster.storage.management.gui.actions.StopVolumeAction"
label="S&amp;top Volume"
@@ -1179,6 +1151,7 @@
allowLabelUpdate="false"
class="com.gluster.storage.management.gui.actions.StartVolumeAction"
definitionId="com.gluster.storage.management.gui.commands.StartVolume"
+ enablesFor="+"
icon="icons/volume-start.png"
id="com.gluster.storage.management.gui.actions.StartVolumeAction"
label="&amp;Start Volume"
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
index 8be1c672..230bff6a 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/AddServerAction.java
@@ -28,11 +28,8 @@ import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
import com.gluster.storage.management.client.GlusterServersClient;
import com.gluster.storage.management.core.constants.CoreConstants;
-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.core.model.Status;
-import com.gluster.storage.management.core.model.Volume;
import com.gluster.storage.management.core.response.GlusterServerResponse;
import com.gluster.storage.management.gui.utils.GUIHelper;
@@ -106,16 +103,13 @@ public class AddServerAction extends AbstractActionDelegate {
System.out.println("Disposing [" + this.getClass().getSimpleName() + "]");
}
- @SuppressWarnings("rawtypes")
@Override
public void selectionChanged(IAction action, ISelection selection) {
- super.selectionChanged(action, selection);
-
- if (selectedEntity != null && selectedEntity instanceof Entity) {
+ Set<Server> selectedServers = GUIHelper.getInstance().getSelectedEntities(getWindow(), Server.class);
+ if (selectedServers == null || selectedServers.isEmpty()) {
+ action.setEnabled(false);
+ } else {
action.setEnabled(true);
- if (selectedEntity instanceof EntityGroup && ((EntityGroup) selectedEntity).getEntityType() == Volume.class) {
- action.setEnabled(false);
- }
}
}
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
index c7e437e8..0ca5627c 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/actions/RemoveServerAction.java
@@ -27,6 +27,7 @@ import java.util.Map.Entry;
import java.util.Set;
import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Display;
import com.gluster.storage.management.client.GlusterDataModelManager;
@@ -147,4 +148,15 @@ public class RemoveServerAction extends AbstractActionDelegate {
public void dispose() {
}
+
+ @Override
+ public void selectionChanged(IAction action, ISelection selection) {
+ Set<GlusterServer> selectedServers = GUIHelper.getInstance().getSelectedEntities(getWindow(),
+ GlusterServer.class);
+ if(selectedServers == null || selectedServers.isEmpty()) {
+ action.setEnabled(false);
+ } else {
+ action.setEnabled(true);
+ }
+ }
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
index 56a6c94b..a38c6b38 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/utils/GUIHelper.java
@@ -18,8 +18,10 @@
*******************************************************************************/
package com.gluster.storage.management.gui.utils;
+import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
+import java.util.List;
import java.util.Set;
import org.eclipse.jface.action.Action;
@@ -30,11 +32,17 @@ import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.ColumnLayoutData;
import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
@@ -72,6 +80,7 @@ import org.eclipse.ui.progress.IProgressConstants;
import com.gluster.storage.management.core.exceptions.GlusterRuntimeException;
import com.gluster.storage.management.core.model.Disk;
+import com.gluster.storage.management.core.utils.JavaUtil;
import com.gluster.storage.management.gui.Application;
import com.gluster.storage.management.gui.IImageKeys;
import com.gluster.storage.management.gui.views.NavigationView;
@@ -406,7 +415,30 @@ public class GUIHelper {
}
return selectedEntities;
}
-
+
+ public void configureCheckboxTableViewer(final CheckboxTableViewer tableViewer) {
+ tableViewer.addCheckStateListener(new ICheckStateListener() {
+
+ @Override
+ public void checkStateChanged(CheckStateChangedEvent event) {
+ tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
+ }
+ });
+
+ tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public void selectionChanged(SelectionChangedEvent event) {
+ List<Object> checkedElements = Arrays.asList(tableViewer.getCheckedElements());
+ List<Object> selectedElements = ((IStructuredSelection)event.getSelection()).toList();
+
+ if (JavaUtil.listsDiffer(checkedElements, selectedElements)) {
+ tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
+ }
+ }
+ });
+ }
public void showProgressView() {
try {
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersView.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersView.java
index 06b1e282..fa9c2e7f 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersView.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/GlusterServersView.java
@@ -52,7 +52,7 @@ public class GlusterServersView extends ViewPart implements IDoubleClickListener
servers = (EntityGroup<GlusterServer>)guiHelper.getSelectedEntity(getSite(), EntityGroup.class);
}
- page = new GlusterServersPage(parent, SWT.NONE, servers);
+ page = new GlusterServersPage(getSite(), parent, SWT.NONE, servers);
page.addDoubleClickListener(this);
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
index c9fab9e0..36f60998 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/details/GlusterServersPage.java
@@ -19,13 +19,9 @@
package com.gluster.storage.management.gui.views.details;
import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
@@ -39,9 +35,14 @@ import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchSite;
import org.eclipse.ui.forms.widgets.FormToolkit;
+import com.gluster.storage.management.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.model.ClusterListener;
+import com.gluster.storage.management.core.model.DefaultClusterListener;
import com.gluster.storage.management.core.model.EntityGroup;
+import com.gluster.storage.management.core.model.Event;
import com.gluster.storage.management.core.model.GlusterServer;
import com.gluster.storage.management.gui.EntityGroupContentProvider;
import com.gluster.storage.management.gui.GlusterServerTableLabelProvider;
@@ -60,28 +61,23 @@ public class GlusterServersPage extends Composite {
private static final String[] GLUSTER_SERVER_TABLE_COLUMN_NAMES = new String[] { "Name",
"IP Address(es)", "Number\nof CPUs", "Total\nMemory (GB)", "Space (GB)", "Space\nAvailable (GB)", "Status" }; // Removed "Preferred\nNetwork",
- public GlusterServersPage(Composite parent, int style) {
+ public GlusterServersPage(IWorkbenchSite site, final Composite parent, int style, EntityGroup<GlusterServer> servers) {
super(parent, style);
- addDisposeListener(new DisposeListener() {
- public void widgetDisposed(DisposeEvent e) {
- toolkit.dispose();
- }
- });
toolkit.adapt(this);
toolkit.paintBordersFor(this);
setupPageLayout();
Text filterText = guiHelper.createFilterText(toolkit, this);
- setupServerTableViewer(filterText);
- }
-
- public GlusterServersPage(final Composite parent, int style, EntityGroup<GlusterServer> servers) {
- this(parent, style);
+ setupServerTableViewer(site, filterText);
tableViewer.setInput(servers);
parent.layout(); // Important - this actually paints the table
+ createListeners(parent);
+ }
+
+ private void createListeners(final Composite parent) {
/**
* Ideally not required. However the table viewer is not getting laid out properly on performing
* "maximize + restore" So this is a hack to make sure that the table is laid out again on re-size of the window
@@ -94,11 +90,31 @@ public class GlusterServersPage extends Composite {
}
});
- tableViewer.addCheckStateListener(new ICheckStateListener() {
+ final ClusterListener clusterListener = new DefaultClusterListener() {
+
+ @Override
+ public void serverAdded(GlusterServer server) {
+ tableViewer.refresh();
+ }
@Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
+ public void serverRemoved(GlusterServer server) {
+ tableViewer.refresh();
+ }
+
+ @Override
+ public void serverChanged(GlusterServer server, Event event) {
+ tableViewer.update(server, null);
+ }
+ };
+
+ final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
+ modelManager.addClusterListener(clusterListener);
+
+ addDisposeListener(new DisposeListener() {
+ public void widgetDisposed(DisposeEvent e) {
+ toolkit.dispose();
+ modelManager.removeClusterListener(clusterListener);
}
});
}
@@ -151,9 +167,14 @@ public class GlusterServersPage extends Composite {
return tableViewerComposite;
}
- private void setupServerTableViewer(final Text filterText) {
+ private void setupServerTableViewer(IWorkbenchSite site, final Text filterText) {
Composite tableViewerComposite = createTableViewerComposite();
tableViewer = createServerTableViewer(tableViewerComposite);
+ site.setSelectionProvider(tableViewer);
+
+ // make sure that table selection is driven by checkbox selection
+ guiHelper.configureCheckboxTableViewer(tableViewer);
+
// Create a case insensitive filter for the table viewer using the filter text field
guiHelper.createFilter(tableViewer, filterText, false);
}
diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
index 5a6a9d40..20c3cbd4 100644
--- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
+++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/views/pages/ServersPage.java
@@ -1,4 +1,4 @@
-/*******************************************************************************
+ /*******************************************************************************
* Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com>
* This file is part of Gluster Management Console.
*
@@ -18,17 +18,10 @@
*******************************************************************************/
package com.gluster.storage.management.gui.views.pages;
-import java.util.ArrayList;
-import java.util.List;
-
import org.eclipse.jface.layout.TableColumnLayout;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
@@ -45,7 +38,9 @@ import org.eclipse.swt.widgets.Text;
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.client.GlusterDataModelManager;
+import com.gluster.storage.management.core.model.ClusterListener;
+import com.gluster.storage.management.core.model.DefaultClusterListener;
import com.gluster.storage.management.core.model.EntityGroup;
import com.gluster.storage.management.core.model.Server;
import com.gluster.storage.management.gui.EntityGroupContentProvider;
@@ -55,7 +50,7 @@ import com.gluster.storage.management.gui.utils.GUIHelper;
public class ServersPage extends Composite {
private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
- private TableViewer tableViewer;
+ private CheckboxTableViewer tableViewer;
private GUIHelper guiHelper = GUIHelper.getInstance();
public enum SERVER_TABLE_COLUMN_INDICES {
@@ -88,6 +83,10 @@ public class ServersPage extends Composite {
setupPage(site, servers);
parent.layout(); // Important - this actually paints the table
+ createListeners(parent);
+ }
+
+ private void createListeners(final Composite parent) {
/**
* Ideally not required. However the table viewer is not getting laid out properly on performing
* "maximize + restore" So this is a hack to make sure that the table is laid out again on re-size of the window
@@ -99,6 +98,33 @@ public class ServersPage extends Composite {
parent.layout();
}
});
+
+ final ClusterListener clusterListener = new DefaultClusterListener() {
+ @Override
+ public void discoveredServerRemoved(Server server) {
+ refreshViewer();
+ }
+
+ @Override
+ public void discoveredServerAdded(Server server) {
+ refreshViewer();
+ }
+
+ private void refreshViewer() {
+ tableViewer.refresh();
+ parent.update();
+ }
+ };
+
+ final GlusterDataModelManager modelManager = GlusterDataModelManager.getInstance();
+ modelManager.addClusterListener(clusterListener);
+ addDisposeListener(new DisposeListener() {
+ @Override
+ public void widgetDisposed(DisposeEvent e) {
+ toolkit.dispose();
+ modelManager.removeClusterListener(clusterListener);
+ }
+ });
}
public void setInput(EntityGroup<Server> servers) {
@@ -135,21 +161,17 @@ public class ServersPage extends Composite {
// setColumnProperties(table, SERVER_DISK_TABLE_COLUMN_INDICES.DISK_SPACE_IN_USE, SWT.CENTER, 90);
}
- private TableViewer createServerTableViewer(Composite parent) {
+ private CheckboxTableViewer createServerTableViewer(Composite parent) {
final CheckboxTableViewer tableViewer = CheckboxTableViewer.newCheckList(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
// TableViewer tableViewer = new TableViewer(parent, SWT.FLAT | SWT.FULL_SELECTION | SWT.MULTI);
tableViewer.setLabelProvider(new ServerTableLabelProvider());
tableViewer.setContentProvider(new EntityGroupContentProvider<Server>());
setupServerTable(parent, tableViewer.getTable());
-
- tableViewer.addCheckStateListener(new ICheckStateListener() {
-
- @Override
- public void checkStateChanged(CheckStateChangedEvent event) {
- tableViewer.setSelection(new StructuredSelection(tableViewer.getCheckedElements()));
- }
- });
+
+ // make sure that table selection is driven by checkbox selection
+ guiHelper.configureCheckboxTableViewer(tableViewer);
+
return tableViewer;
}