/*
*
* @file CubeViewEditor.java
*
* Copyright (C) 2006-2009 Tensegrity Software GmbH
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License (Version 2) as published
* by the Free Software Foundation at http://www.gnu.org/copyleft/gpl.html.
*
* This program 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 General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place, Suite 330, Boston, MA 02111-1307 USA
*
* If you are developing and distributing open source applications under the
* GPL License, then you are free to use JPalo Modules under the GPL License. For OEMs,
* ISVs, and VARs who distribute JPalo Modules with their products, and do not license
* and distribute their source code under the GPL, Tensegrity provides a flexible
* OEM Commercial License.
*
* @author Philipp Bouillon <Philipp.Bouillon@tensegrity-software.com>
*
* @version $Id: CubeViewEditor.java,v 1.149 2010/04/15 09:55:22 PhilippBouillon Exp $
*
*/
package com.tensegrity.wpalo.client.ui.mvc.cubeview;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.allen_sauer.gwt.log.client.Log;
import com.extjs.gxt.ui.client.Events;
import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.Style.Orientation;
import com.extjs.gxt.ui.client.Style.Scroll;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.BoxComponentEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.event.ToolBarEvent;
import com.extjs.gxt.ui.client.event.WindowEvent;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ComponentHelper;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.TabItem;
import com.extjs.gxt.ui.client.widget.form.LabelField;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.RowData;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.extjs.gxt.ui.client.widget.menu.MenuItem;
import com.extjs.gxt.ui.client.widget.toolbar.SeparatorToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.TextToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToggleToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.extjs.gxt.ui.client.widget.toolbar.ToolItem;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.http.client.URL;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
import com.tensegrity.palo.gwt.core.client.models.XObject;
import com.tensegrity.palo.gwt.core.client.models.admin.XUser;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XAlias;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XAxis;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XAxisHierarchy;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XAxisItem;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XCellCollection;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XDelta;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XLoadInfo;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XPrintConfiguration;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XPrintResult;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XView;
import com.tensegrity.palo.gwt.core.client.models.cubeviews.XViewModel;
import com.tensegrity.palo.gwt.core.client.models.palo.XElement;
import com.tensegrity.palo.gwt.core.client.models.palo.XElementNode;
import com.tensegrity.palo.gwt.core.client.models.palo.XElementType;
import com.tensegrity.palo.gwt.core.client.models.subsets.XSubset;
import com.tensegrity.palo.gwt.widgets.client.container.Container;
import com.tensegrity.palo.gwt.widgets.client.container.ContainerListener;
import com.tensegrity.palo.gwt.widgets.client.container.ContainerWidget;
import com.tensegrity.palo.gwt.widgets.client.container.XObjectContainer;
import com.tensegrity.palo.gwt.widgets.client.cubevieweditor.HierarchySelectionWidget;
import com.tensegrity.palo.gwt.widgets.client.cubevieweditor.HierarchyWidget;
import com.tensegrity.palo.gwt.widgets.client.cubevieweditor.HierarchyWidgetListener;
import com.tensegrity.palo.gwt.widgets.client.cubevieweditor.ViewEditorPanel;
import com.tensegrity.palo.gwt.widgets.client.dnd.PickupDragController;
import com.tensegrity.palo.gwt.widgets.client.palotable.Cell;
import com.tensegrity.palo.gwt.widgets.client.palotable.CellChangedListener;
import com.tensegrity.palo.gwt.widgets.client.palotable.Content;
import com.tensegrity.palo.gwt.widgets.client.palotable.ExpandListener;
import com.tensegrity.palo.gwt.widgets.client.palotable.ItemClickListener;
import com.tensegrity.palo.gwt.widgets.client.palotable.ItemExpandListener;
import com.tensegrity.palo.gwt.widgets.client.palotable.header.HeaderItem;
import com.tensegrity.palo.gwt.widgets.client.util.Limiter;
import com.tensegrity.wpalo.client.DisplayFlags;
import com.tensegrity.wpalo.client.WPaloEvent;
import com.tensegrity.wpalo.client.WPaloPropertyServiceProvider;
import com.tensegrity.wpalo.client.async.Callback;
import com.tensegrity.wpalo.client.async.WaitCursorCallback;
import com.tensegrity.wpalo.client.i18n.ILocalConstants;
import com.tensegrity.wpalo.client.i18n.ILocalMessages;
import com.tensegrity.wpalo.client.i18n.Resources;
import com.tensegrity.wpalo.client.services.cubeview.WPaloCubeViewServiceProvider;
import com.tensegrity.wpalo.client.services.folder.WPaloFolderServiceProvider;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.TestFastTreeDialog;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewBrowser;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewBrowserModel;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.ViewEditorTab;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.importer.PaloSuiteViewCreationDialog;
import com.tensegrity.wpalo.client.ui.mvc.viewbrowser.importer.ViewImportDialog;
import com.tensegrity.wpalo.client.ui.mvc.workbench.Workbench;
import com.tensegrity.wpalo.client.ui.widgets.BusyIndicatorPanel;
import com.tensegrity.wpalo.client.ui.widgets.EditorTab;
public class CubeViewEditor extends LayoutContainer implements ContainerListener, Listener<ToolBarEvent>, ItemExpandListener, ItemClickListener, HierarchyWidgetListener, ClickHandler {
protected transient final ILocalConstants constants = Resources.getInstance().getConstants();
protected transient final ILocalMessages messages = Resources.getInstance().getMessages();
private static final String SAVE_BTN = "vieweditor.button.save";
private static final String SAVE_AS_BTN = "vieweditor.button.saveas";
private static final String PRINT_BTN = "vieweditor.button.print";
private static final String CONNECTION_PICKER_BTN = "vieweditor.button.pickConnection";
private static final String REVERSE_ROWS_BTN = "vieweditor.button.reverserows";
private static final String REVERSE_COLS_BTN = "vieweditor.button.reversecols";
private static final String HIDE_EMPTY_BTN = "vieweditor.button.hideempty";
private static final String SHOW_RULES_BTN = "vieweditor.button.showrules";
private static final String REFRESH_BTN = "vieweditor.button.refresh";
private static final String SHOW_INFO_BTN = "vieweditor.button.showinfo";
private ContentPanel dimRepository = new ContentPanel();
private ContentPanel viewPanel = new ContentPanel();
private ViewEditorPanel editorPanel;
private Container repositoryContainer;
private XViewModel view;
private ToggleToolItem hideEmptyCells;
private ToggleToolItem reverseColumns;
private ToggleToolItem reverseRows;
private ToggleToolItem showRules;
private TextToolItem showInfoButton;
private ToolBar toolbar;
DisplayFlags displayFlags;
private boolean hideInfo = true;
public static final int RIGHT_NONE = 0;
public static final int RIGHT_READ = 1;
public static final int RIGHT_WRITE = 2;
public static final int RIGHT_DELETE = 4;
public static final int RIGHT_CREATE = 8;
public static final int RIGHT_GRANT = 16;
//-1 no yet set, 0 no write right, 1 write right
private int writeRight = -1;
public static native void refreshSubobjects(String id) /*-{
try{
$wnd.sendMessage({'id': id, 'msg': 'Sub Object Saved!!'},'subobjectsaved');
}catch(e){
}
}-*/;
//drag n drop support:
private final PickupDragController dragController =
new PickupDragController(RootPanel.get(), false);
//for dis-/enabling via mark dirty:
TextToolItem save = new TextToolItem();
TextToolItem saveAs = new TextToolItem();
TextToolItem print = new TextToolItem();
private final EditorTab tab;
private boolean isDirty;
private BorderLayoutData dimRepoLayoutData;
private SetupHandler setupHandler;
private BusyIndicatorPanel waitPanel = null;
private final HandlerRegistration cubeViewResizeHandler;
private final HashMap <String, XElementNode []> visibles = new HashMap <String, XElementNode []>();
private final HashMap <String, XElementNode []> oldVisibles = new HashMap <String, XElementNode []>();
// public static boolean hasBeenResized = false;
// public static boolean fromDirectLink = false;
// private int SHOW_WAIT_CURSOR_THRESHOLD = 0;
private String tableColumnsMaxWidth;
private String tableRowsHeaderMaxWidth;
private String tableDataCellToLongString;
private final void initMaxWidths() {
WPaloPropertyServiceProvider.getInstance().getStringProperty("tableColumnsMaxWidth", new AsyncCallback<String>() {
private final void determineWidth(String r) {
tableColumnsMaxWidth = r;
TextToolItem measure = new TextToolItem(r);
editorPanel.add(measure);
int size = measure.getOffsetWidth();
if (size > 0) {
Content.MAX_COLUMN_WIDTH = size;
}
editorPanel.remove(measure);
}
public void onFailure(Throwable arg0) {
determineWidth("-999.999.999.999.999.999,90");
}
public void onSuccess(String result) {
if (result == null || result.isEmpty()) {
determineWidth("-999.999.999.999.999.999,90");
} else {
determineWidth(result);
}
}
});
WPaloPropertyServiceProvider.getInstance().getStringProperty("tableRowsHeaderMaxWidth", new AsyncCallback<String>() {
private final void determineWidth(String r) {
tableRowsHeaderMaxWidth = r;
TextToolItem measure = new TextToolItem(r);
editorPanel.add(measure);
int size = measure.getOffsetWidth();
if (size > 0) {
Content.MAX_ROWS_COL_WIDTH = size;
}
editorPanel.remove(measure);
}
public void onFailure(Throwable arg0) {
determineWidth("-999.999.999.999.999.999,90");
}
public void onSuccess(String result) {
if (result == null || result.isEmpty()) {
determineWidth("-999.999.999.999.999.999,90");
} else {
determineWidth(result);
}
}
});
WPaloPropertyServiceProvider.getInstance().getStringProperty("tableDataCellToLongString", new AsyncCallback<String>() {
public void onFailure(Throwable arg0) {
tableDataCellToLongString = "#####";
Content.FILL_STRING = "#####";
}
public void onSuccess(String result) {
if (result == null || result.isEmpty()) {
Content.FILL_STRING = "#####";
tableDataCellToLongString = "#####";
} else {
Content.FILL_STRING = result;
tableDataCellToLongString = result;
}
}
});
}
public CubeViewEditor(EditorTab tab) {
WPaloPropertyServiceProvider.getInstance().getBooleanProperty("hideInfoButtonInView", false,
new AsyncCallback<Boolean>() {
private final void checkToolbar() {
if (toolbar != null) {
if (hideInfo) {
ToolItem it = toolbar.getItemByItemId(SHOW_INFO_BTN);
if (it != null) {
toolbar.remove(it);
toolbar.remove(toolbar.getItem(toolbar.getItemCount() - 1));
}
} else {
ToolItem it = toolbar.getItemByItemId(SHOW_INFO_BTN);
if (it == null) {
toolbar.add(new SeparatorToolItem());
toolbar.add(showInfoButton);
}
}
}
}
public void onFailure(Throwable arg0) {
hideInfo = false;
checkToolbar();
}
public void onSuccess(Boolean result) {
hideInfo = result;
checkToolbar();
}
});
cubeViewResizeHandler =
Window.addResizeHandler(new ResizeHandler() {
public void onResize(ResizeEvent arg0) {
if (editorPanel.getTable().isChangeSize()) {
editorPanel.getTable().setChangeSize(false);
editorPanel.setVisible(false);
if (waitPanel == null) {
waitPanel = new BusyIndicatorPanel();
waitPanel.show(constants.resizing(), false);
}
}
}
});
this.tab = tab;
setLayout(new BorderLayout());
setMonitorWindowResize(true);
}
protected void onDetach() {
super.onDetach();
if (cubeViewResizeHandler != null) {
cubeViewResizeHandler.removeHandler();
}
}
protected void onRender(final Element parent, final int index) {
super.onRender(parent, index);
}
public final void initialize(boolean showSaveButtons, DisplayFlags displayFlags) {
//the editor consists of two panels:
this.displayFlags = displayFlags;
if (this.displayFlags == null) {
this.displayFlags = DisplayFlags.empty;
}
initDimensionPanel();
initViewPanel(showSaveButtons);
initDnD();
initEventHandling();
markDirty(false);
}
final int getWritePermission() {
return writeRight;
}
protected void onWindowResize(int width, int height) {
editorPanel.getTable().setChangeSize(true);
editorPanel.setVisible(true);
if (waitPanel != null) {
waitPanel.hide();
waitPanel = null;
}
// hasBeenResized = true;
super.onWindowResize(width, height);
}
public final void setInput(final XViewModel view) {
this.view = view;
editorPanel.hideEmptyCells(view.isHideEmptyCells());
editorPanel.reverseColumns(view.isColumnsReversed());
editorPanel.reverseRows(view.isRowsReversed());
editorPanel.setInput(view);
fastSetInputInternal(view);
_layout();
restoreRepository(view);
}
private final void fastSetInput(XViewModel view) {
this.view = view;
editorPanel.fastSetInput(view);
fastSetInputInternal(view);
int clientWidth = displayFlags.isHideStaticFilter() ? Limiter.setClientWidth(0) : Limiter.setClientWidth(repositoryContainer, dimRepository.getInnerWidth()-2);
int clientHeight = displayFlags.isHideStaticFilter() ? Limiter.setClientHeight(0) : Limiter.setClientHeight(repositoryContainer, dimRepository.getInnerHeight() - 1);
if (clientWidth <= 0) {
clientWidth = 22;
}
if (clientHeight <= 0) {
clientHeight = 480;
}
if (clientWidth > 200) {
clientWidth = 22;
}
if (!displayFlags.isHideStaticFilter()) {
repositoryContainer.layout(clientWidth, clientHeight);
} else {
repositoryContainer.layout(2, 2);
repositoryContainer.setVisible(false);
}
restoreRepository(view);
}
private final void fastSetInputInternal(XViewModel view) {
initialiseRepository(view);
if (!displayFlags.isHideStaticFilter()) {
dimRepository.setHeading(constants.staticFilters());
}
viewPanel.setHeading(messages.view(modify(view.getName())));
hideEmptyCells.toggle(view.isHideEmptyCells());
if (view.isHideEmptyCells()) {
editorPanel.hideEmptyCells(true);
}
reverseColumns.toggle(view.isColumnsReversed());
if (view.isColumnsReversed()) {
editorPanel.reverseColumns(true);
}
reverseRows.toggle(view.isRowsReversed());
if (view.isRowsReversed()) {
editorPanel.reverseRows(true);
}
showRules.toggle(view.isShowRules());
if (view.isShowRules()) {
editorPanel.markRuleBasedCells(true);
}
}
private final void restoreRepository(XViewModel view) {
//initial width:
if (!displayFlags.isHideStaticFilter()) {
XAxis repositoryAxis = view.getRepositoryAxis();
int width = getPreferredWidth(repositoryAxis.getProperty(XAxis.PREFERRED_WIDTH));
setupHandler.setupWidth(width);
setupHandler.setupDone();
}
}
public final boolean isDirty() {
return isDirty;
}
private final void initialiseRepository(XViewModel view) {
XAxis repositoryAxis = view.getRepositoryAxis();
addRepositoryAxes(repositoryAxis.getAxisHierarchies());
checkDnDState();
}
private final void addRepositoryAxes(List<XAxisHierarchy> hierarchies) {
repositoryContainer.removeAll();
for(XAxisHierarchy hierarchy : hierarchies)
repositoryContainer.add(hierarchy);
}
private final int getPreferredWidth(String width) {
if(width != null) {
try {
return Integer.parseInt(width);
}catch(Exception ex) {
//ignore, we return 0
}
}
return 0;
}
public final XViewModel getView() {
return view;
}
//TODO bug in gxt?? how to retrieve expand/collapse events??
public boolean remove(Widget widget) {
if (setupHandler != null) {
setupHandler.regionExpanded();
}
boolean result = super.remove(widget);
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>() {
public void onSuccess(Void result) {
checkDnDState();
}
});
return result;
}
private final void modifyView(XView xView, final String viewId) {
markDirty(false);
tab.close();
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.creatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloFolderServiceProvider.getInstance().importView(sessionId,
xView,
new Callback<XView>(constants.couldNotCreateView()) {
public void onSuccess(XView xView) {
hideWaitCursor();
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.openingView());
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
List <Boolean> dispFlags = new ArrayList<Boolean>();
dispFlags.add(displayFlags.isHideTitleBar());
dispFlags.add(displayFlags.isHideToolBar());
dispFlags.add(displayFlags.isHideSave());
dispFlags.add(displayFlags.isHideSaveAs());
dispFlags.add(displayFlags.isHideFilter());
dispFlags.add(displayFlags.isHideStaticFilter());
dispFlags.add(displayFlags.isHideHorizontalAxis());
dispFlags.add(displayFlags.isHideVerticalAxis());
dispFlags.add(displayFlags.isHideConnectionPicker());
DisplayFlags.setDisplayFlagsFor(xView, user, dispFlags, null);
xView.setExternalId(viewId);
Dispatcher.get().dispatch(WPaloEvent.EDIT_VIEWBROWSER_VIEW, xView);
}
});
}
public void handleEvent(final ToolBarEvent tbe) {
String button = tbe.item.getId();
if(button.equals(SAVE_BTN))
doSave();
else if(button.equals(SAVE_AS_BTN)){
doSaveAs();
}else if (button.equals(PRINT_BTN)){
doPrint();
}else if(button.equals(REVERSE_ROWS_BTN)) {
editorPanel.reverseRows(((ToggleToolItem) tbe.item).isPressed());
// updateView(null);
markDirty(true);
}
else if(button.equals(REVERSE_COLS_BTN)) {
editorPanel.reverseColumns(((ToggleToolItem) tbe.item).isPressed());
// updateView(null);
markDirty(true);
}
else if(button.equals(HIDE_EMPTY_BTN)) {
showWaitDialog(constants.updatingView());
final boolean pressed = ((ToggleToolItem) tbe.item).isPressed();
final int cellsToDisplay = editorPanel.previewHideEmptyCells(pressed);
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().updateLoadInfo(sessionId, view, cellsToDisplay,
new Callback<XLoadInfo>(constants.updatingViewFailed()) {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
((ToggleToolItem) tbe.item).toggle(!pressed);
}
public void proceed(boolean state) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
editorPanel.hideEmptyCells(pressed);
markDirty(true);
hideWaitCursor();
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
// updateView(null);
}
else if(button.equals(SHOW_RULES_BTN)) {
editorPanel.markRuleBasedCells(((ToggleToolItem) tbe.item).isPressed());
// updateView(null);
markDirty(true);
}
else if(button.equals(REFRESH_BTN)) {
doRefresh();
} else if (button.equals(SHOW_INFO_BTN)) {
doShowAbout();
} else if (button.equals(CONNECTION_PICKER_BTN)) {
final PaloSuiteViewCreationDialog dia =
new PaloSuiteViewCreationDialog();
dia.addButtonListener(ViewImportDialog.BUTTON_OK,
new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
final XView[] xViews = dia.getSelectedViews();
if (xViews != null && xViews.length == 1) {
final String extId = view.getExternalId();
view.setExternalId("_");
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.applyingModifications());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().saveView(sessionId,
view, new Callback<XViewModel>(){
public void onSuccess(XViewModel arg0) {
((Workbench) Registry.get(Workbench.ID)).hideWaitCursor();
xViews[0].setExternalId(extId);
modifyView(xViews[0], extId);
}
});
}
}
});
dia.show();
}
}
public void dropped(final ContainerWidget widget, int atIndex) {
markDirty(true);
//check if row or column container has changed:
if(hasRowChanged() || hasColumnChanged()) {
willUpdateView();
} else {
//PR 724: we have to always update server model, but
// if neither rows nor columns have changed,
// we do not have to layout the table.
adjustView();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().proceedUpdateViewWithoutTable(sessionId,
view,
new Callback<XViewModel>(messages.updatingViewFailed(ViewBrowserModel.modify(view.getName()))) {
public void onSuccess(XViewModel view) {
restoreLocalFilter(CubeViewEditor.this.view);
restoreLocalFilter(view);
view.setNeedsRestore(false);
fastSetInput(view);
}
});
}
}
private boolean isInRowOrColumn(XAxisHierarchy hier) {
for (XAxisHierarchy r: editorPanel.getRowHierarchies()) {
if (r.equals(hier)) {
return true;
}
}
for (XAxisHierarchy c: editorPanel.getColumnHierarchies()) {
if (c.equals(hier)) {
return true;
}
}
return false;
}
private boolean hasRowChanged() {
return !areEqual(editorPanel.getRowHierarchies(), view.getRowAxis()
.getAxisHierarchies());
}
private boolean hasColumnChanged() {
return !areEqual(editorPanel.getColumnHierarchies(), view
.getColumnAxis().getAxisHierarchies());
}
private final void removeFilterNodes(XAxis axis) {
for (XAxisHierarchy hier: axis.getAxisHierarchies()) {
XElementNode [] oldVis = hier.getOldVisibleElements();
if (oldVis != null && oldVis.length > 0) {
hier.setOldVisibleElements(null);
oldVisibles.put(hier.getId(), oldVis);
}
XElementNode [] vis = hier.getVisibleElements();
if (vis != null && vis.length > 0) {
hier.setVisibleElements(null);
visibles.put(hier.getId(), vis);
}
}
}
private final static void removeFilterNodesForGood(XAxis axis) {
for (XAxisHierarchy hier: axis.getAxisHierarchies()) {
XElementNode [] oldVis = hier.getOldVisibleElements();
if (oldVis != null && oldVis.length > 0) {
hier.setOldVisibleElements(null);
}
XElementNode [] vis = hier.getVisibleElements();
if (vis != null && vis.length > 0) {
hier.setVisibleElements(null);
}
}
}
private final void restoreFilterNodes(XAxis axis) {
for (XAxisHierarchy hier: axis.getAxisHierarchies()) {
if (oldVisibles.containsKey(hier.getId())) {
hier.setOldVisibleElements(oldVisibles.get(hier.getId()));
// oldVisibles.remove(hier.getId());
} else {
hier.setOldVisibleElements(null);
}
if (visibles.containsKey(hier.getId())) {
hier.setVisibleElements(visibles.get(hier.getId()));
// visibles.remove(hier.getId());
} else {
hier.setVisibleElements(null);
}
}
}
private final void restoreSwappedFilterNodes(XAxis axis, XAxis newAxis) {
for (XAxisHierarchy hier: axis.getAxisHierarchies()) {
if (oldVisibles.containsKey(hier.getId())) {
newAxis.getAxisHierarchy(hier.getId()).setOldVisibleElements(oldVisibles.get(hier.getId()));
} else {
newAxis.getAxisHierarchy(hier.getId()).setOldVisibleElements(null);
}
if (visibles.containsKey(hier.getId())) {
newAxis.getAxisHierarchy(hier.getId()).setVisibleElements(visibles.get(hier.getId()));
} else {
newAxis.getAxisHierarchy(hier.getId()).setVisibleElements(null);
}
}
}
private final void removeLocalFilter() {
if (view == null) {
return;
}
removeFilterNodes(view.getSelectionAxis());
removeFilterNodes(view.getColumnAxis());
removeFilterNodes(view.getRepositoryAxis());
removeFilterNodes(view.getRowAxis());
}
public final static void removeLocalFilter(XViewModel view) {
if (view == null) {
return;
}
removeFilterNodesForGood(view.getSelectionAxis());
removeFilterNodesForGood(view.getColumnAxis());
removeFilterNodesForGood(view.getRepositoryAxis());
removeFilterNodesForGood(view.getRowAxis());
}
private final void restoreLocalFilter(XViewModel view) {
if (view == null) {
return;
}
restoreFilterNodes(view.getSelectionAxis());
restoreFilterNodes(view.getColumnAxis());
restoreFilterNodes(view.getRepositoryAxis());
restoreFilterNodes(view.getRowAxis());
}
// private final void restoreSwappedLocalFilter(XViewModel view) {
// if (view == null) {
// return;
// }
// restoreFilterNodes(view.getSelectionAxis());
// restoreSwappedFilterNodes(view.getColumnAxis(), view.getRowAxis());
// restoreFilterNodes(view.getRepositoryAxis());
// restoreSwappedFilterNodes(view.getRowAxis(), view.getColumnAxis());
// }
private final void willUpdateView() {
showWaitDialog(constants.updatingView());
adjustView();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().willUpdateView(sessionId, view,
new Callback<XLoadInfo>(constants.updatingViewFailed()) {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
cancelUpdateView();
}
public void proceed(boolean state) {
proceedUpdateView(loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedUpdateView(XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedUpdateView(sessionId,
view,
new Callback<XViewModel>(messages.updatingViewFailed(ViewBrowserModel.modify(view.getName()))) {
public void onSuccess(XViewModel view) {
if (view.needsRestore()) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
restoreLocalFilter(view);
reset();
setInput(view);
hideWaitCursor();
markDirty(true);
}
});
}
private final void cancelUpdateView() {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().cancelUpdateView(sessionId,
view,
new WaitCursorCallback<XViewModel>(constants.cancelingUpdate(),
messages.cancelViewUpdateFailed(ViewBrowserModel.modify(view.getName()))) {
public void onSuccess(XViewModel view) {
if (view.needsRestore()) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
CubeViewEditor.this.view = view;
initialiseRepository(view);
editorPanel.initRowContainer(view.getRowAxis());
editorPanel.initColumnContainer(view.getColumnAxis());
editorPanel.initSelectionContainer(view.getSelectionAxis());
_layout();
hideWaitCursor();
}
});
}
public void removed(ContainerWidget widget) {
}
protected void onAfterLayout() {
super.onAfterLayout();
_layout();
}
final void checkDnDState() {
if (writeRight == -1 && view != null) {
XUser usr = ((Workbench)Registry.get(Workbench.ID)).getUser();
WPaloCubeViewServiceProvider.getInstance().isOwner(usr.getSessionId(), view.getId(), new AsyncCallback<Boolean>(){
public void onFailure(Throwable arg0) {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
repositoryContainer.register(dragController);
}
}
public void onSuccess(Boolean result) {
if (result) {
writeRight = 1;
} else {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
repositoryContainer.register(dragController);
}
}
}
});
} else if (writeRight == 1) {
repositoryContainer.register(dragController);
}
}
private final void initDnD() {
//initializes the drag and drop behavior within the editor
editorPanel.register(dragController);
}
private final void initDimensionPanel() {
// - a panel for all cube dimensions, at west position
dimRepoLayoutData = new BorderLayoutData(LayoutRegion.WEST);
dimRepoLayoutData.setMargins(new Margins(0,5,0,0));
dimRepoLayoutData.setSplit(true);
dimRepoLayoutData.setCollapsible(true);
dimRepoLayoutData.setFloatable(false); //true);
dimRepoLayoutData.setSize(160);
dimRepoLayoutData.setMinSize(40);
dimRepoLayoutData.setMaxSize(220);
dimRepoLayoutData.setHidden(displayFlags.isHideStaticFilter());
// dimRepository = new ContentPanel(new RowLayout(Orientation.VERTICAL));
dimRepository.setLayoutOnChange(true);
dimRepository.setScrollMode(Scroll.AUTOY);
dimRepository.setLayout(new RowLayout(Orientation.VERTICAL));
dimRepository.setHeight("100%");
dimRepository.setData("layout_region", LayoutRegion.WEST);
dimRepository.sinkEvents(Events.BeforeExpand);
dimRepository.addListener(Events.BeforeExpand, new Listener(){
public void handleEvent(BaseEvent be) {
if (writeRight != 1) {
be.doit = false;
}
}
});
if (displayFlags.isHideStaticFilter()) {
dimRepository.setVisible(false);
}
if (displayFlags.isHideStaticFilter()) {
dimRepoLayoutData.setCollapsible(false);
dimRepoLayoutData.setFloatable(false);
dimRepoLayoutData.setMinSize(0);
dimRepoLayoutData.setMaxSize(0);
dimRepoLayoutData.setSize(0);
add(new LabelField(), dimRepoLayoutData);
} else {
add(dimRepository, dimRepoLayoutData);
}
initRepositoryContainer();
if (displayFlags.isHideStaticFilter()) {
dimRepository.hide();
}
// if (!displayFlags.isHideStaticFilter()) {
dimRepository.add(repositoryContainer, new RowData(1,1));
if(getLayout() instanceof BorderLayout)
setupHandler = new SetupHandler(this, LayoutRegion.WEST);
// }
}
private final void initRepositoryContainer() {
repositoryContainer = new Container(new DimensionRepositoryRenderer(displayFlags.isHideStaticFilter())){
protected void onAttach() {
super.onAttach();
checkDnDState();
}
};
repositoryContainer.setStyleName("static-filter");
Label emptyLabel = new Label(constants.dropToFillStaticFilters());
emptyLabel.setStyleName("empty-label");
DOM.setStyleAttribute(emptyLabel.getElement(), "textAlign", "center");
repositoryContainer.setEmptyLabel(emptyLabel);
if (displayFlags.isHideStaticFilter()) {
repositoryContainer.setVisible(false);
}
}
private final void initViewPanel(boolean showSaveButtons) {
// - a panel to display the current view, at center position
BorderLayoutData layoutData = new BorderLayoutData(LayoutRegion.CENTER);
layoutData.setSize(1.0f);
layoutData.setCollapsible(false);
layoutData.setFloatable(false);
layoutData.setHidden(false);
viewPanel.clearState();
viewPanel.setLayout(new RowLayout());
viewPanel.setCollapsible(false);
viewPanel.setHideCollapseTool(true);
toolbar = new ToolBar();
initMaxWidths();
//the toolbar:
save.setId(SAVE_BTN);
save.setIconStyle("ten-icons-save");
save.addListener(Events.Select, this);
save.setToolTip(constants.saveView());
if (!displayFlags.isHideSave()) {
toolbar.add(save);
}
saveAs.setId(SAVE_AS_BTN);
saveAs.setIconStyle("ten-icons-save-as");
saveAs.addListener(Events.Select, this);
saveAs.setToolTip(constants.saveViewAsSubobject());
final String[] hideSaveSubobjects = {"false"};
WPaloCubeViewServiceProvider.getInstance().getSpagoBIUserMode(new Callback<String>(){
public void onFailure(Throwable t) {
//MessageBox.alert("Save as", "failure", null);
super.onFailure(t);
}
public void onSuccess(String id) {
//MessageBox.alert("Save as", "is dev:"+id, null);
if(id!= null && id.equalsIgnoreCase("true")){
//toolbar.remove(saveAs);
hideSaveSubobjects[0] = "true";
}
if ((hideSaveSubobjects[0]).equals("false")) {
//MessageBox.alert("Save as", "not DEV", null);
if(!displayFlags.isHideSaveAs()){
toolbar.add(saveAs);
}
}
/* if (!displayFlags.isHideSave() || !displayFlags.isHideSaveAs() || (hideSaveSubobjects[0]).equals("true")) {
toolbar.add(new SeparatorToolItem());
}*/
}
});
if (((Workbench)Registry.get(Workbench.ID)).isPaloSuite()) {
if (!displayFlags.isHideConnectionPicker()) {
TextToolItem txtItem = new TextToolItem();
txtItem.setId(CONNECTION_PICKER_BTN);
txtItem.setIconStyle("icon-import-view");
txtItem.setToolTip(constants.changeCube());
txtItem.addListener(Events.Select, this);
toolbar.add(txtItem);
toolbar.add(new SeparatorToolItem());
}
}
print.setId(PRINT_BTN);
print.setIconStyle("icon-print");
print.addListener(Events.Select, this);
print.setToolTip(constants.printView());
if (!displayFlags.isHidePrint()) {
toolbar.add(print);
toolbar.add(new SeparatorToolItem());
}
hideEmptyCells = new ToggleToolItem();
hideEmptyCells.setId(HIDE_EMPTY_BTN);
hideEmptyCells.setIconStyle("ten-icons-hideEmpty");
hideEmptyCells.addListener(Events.Select, this);
hideEmptyCells.setToolTip(constants.hideEmpty());
toolbar.add(hideEmptyCells);
reverseColumns = new ToggleToolItem();
reverseColumns.setId(REVERSE_COLS_BTN);
reverseColumns.setIconStyle("ten-icons-reverseCols");
reverseColumns.setToolTip(constants.reverseColumns());
reverseColumns.addListener(Events.Select, this);
toolbar.add(reverseColumns);
// ~
reverseRows = new ToggleToolItem();
reverseRows.setId(REVERSE_ROWS_BTN);
reverseRows.setIconStyle("ten-icons-reverseRows");
reverseRows.addListener(Events.Select, this);
reverseRows.setToolTip(constants.reverseRows());
toolbar.add(reverseRows);
showRules = new ToggleToolItem();
showRules.setId(SHOW_RULES_BTN);
showRules.setIconStyle("ten-icons-viewRules");
showRules.setToolTip(constants.markRules());
showRules.addListener(Events.Select, this);
toolbar.add(showRules);
toolbar.add(new SeparatorToolItem());
TextToolItem txtItem = new TextToolItem();
txtItem.setId(REFRESH_BTN);
txtItem.setIconStyle("icon-refresh-on");
txtItem.setToolTip(constants.refresh());
txtItem.addListener(Events.Select, this);
toolbar.add(txtItem);
showInfoButton = new TextToolItem();
showInfoButton.setId(SHOW_INFO_BTN);
showInfoButton.setIconStyle("icon-info");
showInfoButton.setToolTip(constants.about());
showInfoButton.addListener(Events.Select, this);
if (!hideInfo) {
toolbar.add(new SeparatorToolItem());
toolbar.add(showInfoButton);
}
if (!displayFlags.isHideToolBar()) {
viewPanel.setTopComponent(toolbar);
} else {
// Leave this alone!
// Due to browser caching the top component _has_ to be set to an
// existing value, before it can safely be overwritten by null.
LabelField label = new LabelField();
viewPanel.setTopComponent(label);
viewPanel.setTopComponent(null);
}
//the view editor panel:
editorPanel = new ViewEditorPanel(this,
displayFlags.isHideFilter(),
displayFlags.isHideHorizontalAxis(),
displayFlags.isHideVerticalAxis());
editorPanel.addClickListener(this);
editorPanel.register((ItemExpandListener) this);
editorPanel.register((ItemClickListener) this);
if (displayFlags.isHideTitleBar()) {
viewPanel.setHeaderVisible(false);
}
viewPanel.add(editorPanel, new RowData(1, 1));
viewPanel.setLayoutData(viewPanel, layoutData);
add(viewPanel);
viewPanel.expand();
}
private final void initEventHandling() {
editorPanel.addContainerListener(this);
repositoryContainer.addContainerListener(this);
editorPanel.addCellChangedListener(new CellChangedListener() {
public void changed(final Cell cell, final String oldValue) {
showWaitDialog(constants.writingCellContents());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().writeCell(sessionId,
cell.getXCell(), view, new Callback<XCellCollection>() {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
String message = caught.getMessage();
if (message == null) {
MessageBox.alert(constants.error(),
constants.writingCellFailed(), null);
} else if (message.indexOf("(1009) insufficient access rights") != -1) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToModifyCell(), null);
} else if (message.indexOf("(5012) sum of weights is") != -1) {
MessageBox.alert(constants.splashingError(),
constants.splashingHint(), null);
} else {
MessageBox.alert(constants.error(),
constants.writingCellFailed(), null);
}
cell.setValue(oldValue, true);
}
public void onSuccess(XCellCollection cells) {
try {
restoreLocalFilter(view);
view.setNeedsRestore(false);
editorPanel.setCells(cells, view);
_layout();
} finally {
hideWaitCursor();
}
}
});
}
});
editorPanel.addExpandListener(new ExpandListener() {
public void willCollapse(HeaderItem item) {
}
public void willExpand(HeaderItem item) {
}
});
}
private final void showWaitDialog(String msg) {
((Workbench)Registry.get(Workbench.ID)).showWaitCursor(msg);
}
private final void hideWaitDialog() {
((Workbench)Registry.get(Workbench.ID)).hideWaitCursor();
}
private final void _layout() {
//we call layout on each component:
int clientWidth = displayFlags.isHideStaticFilter() ? Limiter.setClientWidth(1) : Limiter.setClientWidth(repositoryContainer, dimRepository.getInnerWidth()-2);
int clientHeight = displayFlags.isHideStaticFilter() ? Limiter.setClientHeight(1) : Limiter.setClientHeight(repositoryContainer, dimRepository.getInnerHeight() - 1);
if (clientWidth <= 0) {
clientWidth = 22;
}
if (clientHeight <= 0) {
clientHeight = 480;
}
if (clientWidth > 200) {
clientWidth = 22;
}
if (!displayFlags.isHideStaticFilter()) {
repositoryContainer.layout(clientWidth, clientHeight);
} else {
repositoryContainer.layout(22, 2);
repositoryContainer.setVisible(false);
}
clientWidth = Limiter.setClientWidth(editorPanel, viewPanel.getInnerWidth());
clientHeight = Limiter.setClientHeight(editorPanel, viewPanel.getInnerHeight());
if (clientWidth <= 0) {
clientWidth = 640;
}
if (clientHeight <= 0) {
clientHeight = 480;
}
editorPanel.layout(clientWidth, clientHeight, displayFlags.isHideStaticFilter() ? 0 : 0);
}
private final boolean areEqual(XAxisHierarchy[] hierarchies, List<XAxisHierarchy> list) {
boolean result = false;
if(hierarchies.length == list.size()) {
result = true;
for(int i=0;i<hierarchies.length;++i) {
if(!hierarchies[i].equals(list.get(i))) {
result = false;
break;
}
}
}
return result;
}
public final void save(Callback<XViewModel> callback) {
updateAndSaveView(callback);
}
private final void doSaveAfterCheck() {
showWaitDialog(constants.savingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>() {
public void onSuccess(Void none) {
updateAndSaveView(new Callback<XViewModel>(constants.savingViewFailed()) {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(XViewModel view) {
if (view == null) {
restoreLocalFilter(CubeViewEditor.this.view);
CubeViewEditor.this.view.setNeedsRestore(false);
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>(){
public void onSuccess(Void arg0) {
hideWaitCursor();
}});
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToSaveView(), null);
return;
}
restoreLocalFilter(view);
view.setNeedsRestore(false);
markDirty(false);
reset();
setInput(view);
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>(){
public void onSuccess(Void arg0) {
hideWaitCursor();
}});
}
});
}
});
}
private final void doSave() {
if (writeRight == -1) {
XUser usr = ((Workbench)Registry.get(Workbench.ID)).getUser();
WPaloCubeViewServiceProvider.getInstance().isOwner(usr.getSessionId(), view.getId(), new AsyncCallback<Boolean>(){
public void onFailure(Throwable arg0) {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
doSaveAfterCheck();
}
if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToSaveView(), null);
}
}
public void onSuccess(Boolean result) {
if (result) {
writeRight = 1;
} else {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
doSaveAfterCheck();
}
if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToSaveView(), null);
}
}
}
});
} else if (writeRight == 1) {
doSaveAfterCheck();
} else if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToSaveView(), null);
}
}
private final void executePrint(XPrintConfiguration config) {
final String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
config.setMaxWidths(tableColumnsMaxWidth, tableRowsHeaderMaxWidth, tableDataCellToLongString);
WPaloCubeViewServiceProvider.getInstance().generatePDF(sessionId, view, config, new Callback<XPrintResult>() {
public void onSuccess(final XPrintResult result) {
hideWaitCursor();
if (result == null || result.getFilename() == null) {
MessageBox.alert(constants.printError(),
constants.errorsWhilePrinting(), null);
} else {
String fileName = result.getFilename(); //URL.encode(result.getFilename());
int index = Math.max(fileName.lastIndexOf("/"), fileName.lastIndexOf("\\"));
if (index != -1) {
fileName = fileName.substring(index + 1);
}
fileName = URL.encode(fileName);
final String link = GWT.getModuleBaseURL() + "downloads/" + fileName;
WPaloPropertyServiceProvider.getInstance().getBooleanProperty("askForPDFFileDeletion", false, new Callback<Boolean>() {
public void onSuccess(Boolean res) {
if (res) {
MessageBox.confirm(constants.downloadPDFHeader(),
messages.downloadPDF(link),
new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
if (be.buttonClicked.getItemId().equalsIgnoreCase(Dialog.YES)) {
WPaloCubeViewServiceProvider.getInstance().deleteFile(result.getFilename(), new Callback<Void>() {
public void onSuccess(Void arg0) {
}
});
}
}
});
} else {
MessageBox.info(constants.downloadPDFHeader(),
messages.downloadPDFOnlyClose(link),
new Listener<WindowEvent>(){
public void handleEvent(
WindowEvent be) {
WPaloCubeViewServiceProvider.getInstance().deleteFile(result.getFilename(), new Callback<Void>() {
public void onSuccess(Void arg0) {
}
});
}});
}
}
});
// String fileName = URL.encode(result.getFilename());
// String link = GWT.getModuleBaseURL() + "wpalo-download.srv" +
// "?fileName=" + fileName + "&viewName=" + view.getName() + ".pdf";
// DOM.setElementAttribute(RootPanel.get("wpalo_download").getElement(),
// "src", link);
}
view.setHideEmptyCells(hideEmptyCells.isPressed());
view.setColumnsReversed(reverseColumns.isPressed());
view.setRowsReversed(reverseRows.isPressed());
editorPanel.hideEmptyCells(view.isHideEmptyCells());
editorPanel.reverseColumns(view.isColumnsReversed());
editorPanel.reverseRows(view.isRowsReversed());
XViewModel view = result.getView();
restoreLocalFilter(view);
view.setNeedsRestore(false);
reset();
setInput(view);
}
});
}
private final void doPrint() {
if (view.getColumnAxis().getAxisHierarchies().isEmpty() ||
view.getRowAxis().getAxisHierarchies().isEmpty()) {
MessageBox.alert(constants.printError(),
constants.cantPrintEmptyView(), null);
return;
}
final PrintDialog pd = new PrintDialog(view);
pd.addButtonListener(PrintDialog.BUTTON_OK,
new Listener<BaseEvent>() {
public void handleEvent(BaseEvent be) {
showWaitDialog(constants.printingView());
final XPrintConfiguration config = pd.getPrintConfiguration();
view.setHideEmptyCells(hideEmptyCells.isPressed());
view.setColumnsReversed(reverseColumns.isPressed());
view.setRowsReversed(reverseRows.isPressed());
updateView(new Callback<Void>() {
public void onFailure(Throwable t) {
super.onFailure(t);
System.err.println("Call Failed...");
hideWaitCursor();
}
public void onSuccess(Void arg0) {
executePrint(config);
}
});
}
});
pd.show();
}
private final void doSaveAsAfterCheck() {
final String[] usedNames = getViewNames();
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
int permission = user.isAdmin() ? 0 : 16;
WPaloCubeViewServiceProvider.getInstance().checkPermission(user.getSessionId(), permission, new AsyncCallback <Boolean>(){
private final void showDialog(boolean showBoxes) {
final SaveAsDialog saveAsDlg = new SaveAsDialog(view.getName(), showBoxes);
saveAsDlg.setUsedViewNames(usedNames);
// add close listener:
saveAsDlg.addListener(Events.Close, new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
try {
// which button was pressed:
if (be.buttonClicked.getItemId().equals(SaveAsDialog.SAVE)) {
showWaitDialog(constants.savingView());
updateView(new Callback<Void>() {
public void onFailure(Throwable t) {
//Window.alert("fallito!");
super.onFailure(t);
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
public void onSuccess(Void arg0) {
String viewName = saveAsDlg.getViewName();
//Window.alert("ok!");
((ViewEditorTab) tab).saveAs(viewName, view,
saveAsDlg.isPublic(), saveAsDlg.isEditable(), new Callback<Boolean>(){
public void onSuccess(Boolean result) {
WPaloCubeViewServiceProvider.getInstance().getSubobjectId(new Callback<String>(){
public void onFailure(Throwable t) {
super.onFailure(t);
}
public void onSuccess(String id) {
refreshSubobjects(id);
}
});
if (result) {
save.setEnabled(false);
tab.close();
}
}
});
}
});
}
} catch (Throwable t) {
Log.error(t.getMessage(), t);
t.printStackTrace();
}
}
});
saveAsDlg.show();
}
public void onSuccess(Boolean result) {
if (result) {
showDialog(true);
} else {
showDialog(false);
}
}
public void onFailure(Throwable arg0) {
showDialog(false);
}
});
}
private final void doSaveAs() {
if (writeRight == -1) {
XUser usr = ((Workbench)Registry.get(Workbench.ID)).getUser();
WPaloCubeViewServiceProvider.getInstance().isOwner(usr.getSessionId(), view.getId(), new AsyncCallback<Boolean>(){
public void onFailure(Throwable arg0) {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
doSaveAsAfterCheck();
}
if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToSaveView(), null);
}
}
public void onSuccess(Boolean result) {
if (result) {
writeRight = 1;
doSaveAsAfterCheck();
} else {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
doSaveAsAfterCheck();
}
if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToSaveView(), null);
}
}
}
});
} else if (writeRight == 1) {
doSaveAsAfterCheck();
} else if (writeRight == 0) {
MessageBox.alert(constants.notEnoughRights(), constants.notEnoughRightsToSaveView(), null);
}
}
private final String[] getViewNames() {
ViewBrowser viewBrowser = (ViewBrowser) Registry.get(ViewBrowser.ID);
String[] names = null;
try{
XView[] views = viewBrowser.getViews();
names = new String[views.length];
for(int i = 0; i < views.length; ++i) {
if (views[i] == null || views[i].getName() == null) {
names[i] = constants.deletedView();
} else {
names[i] = views[i].getName();
}
}
}catch(Exception re){
names = new String[1];
names[0]="";
}
return names;
}
private final void doShowAbout() {
WPaloPropertyServiceProvider.getInstance().getBuildNumber(new AsyncCallback<String>() {
public void onFailure(Throwable arg0) {
ViewBrowser.displayAboutDialog("<" + constants.unknown() + ">", null);
}
public void onSuccess(final String result) {
WPaloPropertyServiceProvider.getInstance().getCurrentBuildNumber(new AsyncCallback<String []>(){
public void onFailure(Throwable arg0) {
ViewBrowser.displayAboutDialog(result, null);
}
public void onSuccess(String [] buildInformation) {
ViewBrowser.displayAboutDialog(result, buildInformation);
}
});
}
});
}
private final void doRefresh() {
showWaitDialog(constants.refreshingView());
editorPanel.initWithCurrentState();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().willReload(sessionId, view,
new Callback<XLoadInfo>(constants.refreshingViewFailed()) {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
restoreLocalFilter(view);
view.setNeedsRestore(false);
hideWaitCursor();
}
public void proceed(boolean state) {
proceedRefresh(loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedRefresh(XLoadInfo loadInfo) {
showWaitDialog(constants.refreshingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedReload(sessionId, view,
new Callback<XViewModel>(constants.refreshingViewFailed()) {
public void onFailure(Throwable t) {
super.onFailure(t);
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
public void onSuccess(XViewModel view) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
reset();
setInput(view);
markDirty(true);
hideWaitCursor();
}
});
}
private final void changeSelectedElement(final HierarchySelectionWidget hierWidget, final XElement selectedElement) {
showWaitDialog(constants.changingSelectedElement());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
WPaloCubeViewServiceProvider.getInstance().willChangeSelectedElement(sessionId,
view, hierWidget.getHierarchy(),
new Callback<XLoadInfo>(constants.changingSelectedElementFailed()) {
public void onFailure(Throwable caught) {
restoreLocalFilter(view);
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
restoreLocalFilter(view);
hideWaitCursor();
}
public void proceed(boolean state) {
proceedChangeSelectedElement(hierWidget,
selectedElement, loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedChangeSelectedElement(final HierarchySelectionWidget hierWidget,
final XElement selectedElement, XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.changingSelectedElement());
final XAxisHierarchy xAxisHierarchy = hierWidget.getHierarchy();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedChangeSelectedElement(sessionId,
view, xAxisHierarchy, selectedElement,
new Callback<XViewModel>(constants.changingSelectedElementFailed()) {
public void onSuccess(XViewModel view) {
restoreLocalFilter(view);
hierWidget.setSelectedElement(selectedElement);
editorPanel.initWithCurrentState();
reset();
setInput(view);
markDirty(true);
hideWaitCursor();
}
});
}
private final void adjustView() {
editorPanel.saveState(view);
if (!displayFlags.isHideStaticFilter()) {
if(dimRepository.isExpanded())
setWidthOfRepositoryAxis(dimRepository.getInnerWidth());
else
setWidthOfRepositoryAxis(0);
} else {
setWidthOfRepositoryAxis(0);
}
adjustAxis(view.getRepositoryAxis(), getHierarchies(repositoryContainer));
adjustAxis(view.getSelectionAxis(), editorPanel.getSelectionHierarchies());
adjustAxis(view.getRowAxis(), editorPanel.getRowHierarchies());
adjustAxis(view.getColumnAxis(), editorPanel.getColumnHierarchies());
}
private final void setWidthOfRepositoryAxis(int width) {
if(view != null) {
XAxis repositoryAxis = view.getRepositoryAxis();
String _width = Integer.toString(width);
repositoryAxis.addProperty(XAxis.PREFERRED_WIDTH, _width);
}
}
private final void updateView(Callback<Void> updateCallback) {
adjustView();
if (updateCallback == null) {
updateCallback = new Callback<Void>() {
public void onFailure(Throwable t) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
public void onSuccess(Void arg0) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
}
};
}
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().updateView(sessionId, view,
updateCallback);
/* WPaloCubeViewServiceProvider.getInstance().getSubobjectId(new Callback<String>(){
public void onFailure(Throwable t) {
super.onFailure(t);
}
public void onSuccess(String id) {
refreshSubobjects(id);
}
});*/
}
private final void updateAndSaveView(final Callback<XViewModel> callbackAfterSave) {
updateView(new Callback<Void>() {
public void onSuccess(Void arg0) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().saveView(sessionId,
view, new Callback<XViewModel>(){
public void onFailure(Throwable t) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
super.onFailure(t);
callbackAfterSave.onFailure(t);
}
public void onSuccess(XViewModel xViewModel) {
restoreLocalFilter(xViewModel);
xViewModel.setNeedsRestore(false);
callbackAfterSave.onSuccess(xViewModel);
}
});
}
});
}
private final void adjustAxis(XAxis axis, XAxisHierarchy[] hierarchies) {
axis.clear();
for(XAxisHierarchy hierarchy : hierarchies) {
axis.add(hierarchy);
hierarchy.setAxisId(axis.getId(), axis.getViewId());
}
}
private final XAxisHierarchy[] getHierarchies(XObjectContainer container) {
XObject[] xObjects = container.getXObjects();
XAxisHierarchy[] hierarchies = new XAxisHierarchy[xObjects.length];
for (int i = 0; i < xObjects.length; ++i)
hierarchies[i] = (XAxisHierarchy) xObjects[i];
return hierarchies;
}
private final void reset() {
editorPanel.reset();
repositoryContainer.reset();
}
public void pressedFilter(final HierarchyWidget widget) {
showFilterSelection(widget);
}
public void pressedSelectElement(HierarchySelectionWidget widget) {
showMenu(widget);
}
private final void showMenu(final HierarchySelectionWidget widget) {
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.displayingElementTree(), true);
final XAxisHierarchy xAxisHierarchy = widget.getHierarchy();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
String elementId = xAxisHierarchy.getSelectedElement() == null ? "" : xAxisHierarchy.getSelectedElement().getId();
WPaloCubeViewServiceProvider.getInstance().getNumberOfChildren(sessionId, xAxisHierarchy.getId(), xAxisHierarchy.getViewId(), xAxisHierarchy.getAxisId(), elementId, new Callback <Integer>(){
public void onFailure(Throwable t) {
((Workbench) Registry.get(Workbench.ID)).hideWaitCursor();
super.onFailure(t);
}
public void onSuccess(Integer result) {
((Workbench) Registry.get(Workbench.ID)).hideWaitCursor();
LargeQueryWarningDialog.confirm(result, new ConfirmLoadDialogListener() {
public void proceed(final boolean state) {
((Workbench) Registry.get(Workbench.ID)).showWaitCursor(constants.displayingElementTree(), true);
try {
final SelectElementDialog menu = new SelectElementDialog(view, xAxisHierarchy, state);
menu.addSelectionListener(new Listener<SelectionEvent>() {
public void handleEvent(SelectionEvent se) {
XObject selection = se.getSelection();
XElement selectedElement = null;
if (selection instanceof XElement) {
selectedElement = (XElement) selection;
} else if(selection instanceof XElementNode) {
XElementNode node = (XElementNode) selection;
selectedElement = node.getElement();
}
((Workbench) Registry.get(Workbench.ID)).hideWaitCursor();
if (selectedElement != null
&& !selectedElement.equals(xAxisHierarchy.getSelectedElement()))
changeSelectedElement(widget, selectedElement);
}
});
menu.show(widget);
menu.focus();
} catch (Throwable t) {
t.printStackTrace();
}
}
public void cancel() {
}
});
}
});
}
private final boolean contains(XElementNode [] nodes, XElement element) {
if (nodes == null) {
return true;
}
for (XElementNode node: nodes) {
if (node.getElement().equals(element)) {
return true;
}
if (contains(node.getChildren(), element)) {
return true;
}
}
return false;
}
private final void checkSubset(final XAxisHierarchy hierarchy, final XAlias oldAlias, final XSubset oldSubset, final XElement oldSelectedElement,
final XSubset selectedSubset, final String oldPaths, final String oldAliasFormat, final XElementNode [] initialVisibleElements, final HierarchyWidget widget) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().containsElement(sessionId, hierarchy.getId(), hierarchy.getViewId(), hierarchy.getAxisId(), oldSelectedElement, selectedSubset,
new Callback<Boolean>(){
public void onSuccess(Boolean result) {
if (result) {
adjustView();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedUpdateViewWithoutTable(sessionId,
view,
new Callback<XViewModel>(messages.updatingViewFailed(ViewBrowserModel.modify(view.getName()))) {
public void onSuccess(XViewModel view) {
markDirty(true);
fastSetInput(view);
if (widget instanceof HierarchySelectionWidget) {
((HierarchySelectionWidget) widget).setSelectedElement(hierarchy.getSelectedElement());
}
widget.update();
hideWaitDialog();
}
});
} else {
willUpdateHierarchy(widget, oldSubset, oldAlias, initialVisibleElements,
oldPaths, oldAliasFormat, oldSelectedElement);
}
}
});
}
private final void showFilterSelection(final HierarchyWidget widget, boolean fastTreeTest) {
final TestFastTreeDialog tftd = new TestFastTreeDialog(view, widget.getHierarchy());
tftd.show();
}
private final void applyFilterSettings(final FilterSelectionDialog dlg, final XElementNode [] initialVisibleElements, final HierarchyWidget widget) {
final String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>() {
public void onSuccess(Void arg0) {
final String oldPaths = widget.getHierarchy().getProperty("filterPaths");
final String oldAliasFormat = widget.getHierarchy().getProperty("aliasFormat");
final XAxisHierarchy hierarchy = widget.getHierarchy();
// get old settings:
final XAlias oldAlias = hierarchy.getActiveAlias();
final XSubset oldSubset = hierarchy.getActiveSubset();
final XElement oldSelectedElement = hierarchy.getSelectedElement();
hierarchy.setOldVisibleElements(hierarchy.getVisibleElements());
if (hierarchy.getVisibleElements() == null || hierarchy.getVisibleElements().length == 0) {
oldVisibles.remove(hierarchy.getId());
} else {
oldVisibles.put(hierarchy.getId(), hierarchy.getVisibleElements());
}
XElementNode [] newSelElems = dlg.getVisibleElements();
if (newSelElems == null || newSelElems.length == 0) {
visibles.remove(hierarchy.getId());
} else {
visibles.put(hierarchy.getId(), newSelElems);
}
// //apply changes:
hierarchy.setActiveAlias(dlg.getSelectedAlias());
hierarchy.setActiveSubset(dlg.getSelectedSubset());
hierarchy.setVisibleElements(newSelElems);
hierarchy.setSelectedElement(dlg.getSelectedElement());
final boolean containsSelected = contains(hierarchy.getVisibleElements(), oldSelectedElement);
if (isInRowOrColumn(hierarchy)) {
willUpdateHierarchy(widget, oldSubset, oldAlias, initialVisibleElements, oldPaths, oldAliasFormat, oldSelectedElement);
} else {
if (!containsSelected || (dlg.getOldSelectedElement() == null && hierarchy.getSelectedElement() != null)) {
willUpdateHierarchy(widget, oldSubset, oldAlias, initialVisibleElements, oldPaths, oldAliasFormat, dlg.getOldSelectedElement());
} else {
if (dlg.getSelectedSubset() != null) {
checkSubset(hierarchy, oldAlias, oldSubset, oldSelectedElement,
dlg.getSelectedSubset(), oldPaths, oldAliasFormat, initialVisibleElements, widget);
} else {
showWaitDialog(constants.applyingSelection());
adjustView();
WPaloCubeViewServiceProvider.getInstance().proceedUpdateViewWithoutTable(sessionId,
view,
new Callback<XViewModel>(messages.updatingViewFailed(ViewBrowserModel.modify(view.getName()))) {
public void onSuccess(XViewModel view) {
markDirty(true);
fastSetInput(view);
if (widget instanceof HierarchySelectionWidget) {
((HierarchySelectionWidget) widget).setSelectedElement(hierarchy.getSelectedElement());
}
widget.update();
hideWaitDialog();
}
});
}
}
}
}
});
}
private final void showFilterSelection(final HierarchyWidget widget) {
final XElementNode[] initialVisibleElements =
widget.getHierarchy().getVisibleElements();
final FilterSelectionDialog dlg =
new FilterSelectionDialog(widget.getHierarchy(), view);
dlg.addListener(Events.Close,
new Listener<WindowEvent>() {
public void handleEvent(WindowEvent be) {
// which button was pressed:
String buttonId = be.buttonClicked.getItemId();
if (buttonId.equals(FilterSelectionDialog.APPLY)) {
showWaitDialog(constants.applyingSelection());
applyFilterSettings(dlg, initialVisibleElements, widget);
} else if (buttonId.equals(FilterSelectionDialog.CANCEL)) {
//we set visible elements again, because we have
//removed them on open!!!
showWaitDialog(constants.updatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>() {
public void onSuccess(Void arg0) {
XAxisHierarchy hierarchy = widget.getHierarchy();
hierarchy.setVisibleElements(initialVisibleElements);
updateHierarchy(hierarchy); //AndReloadView();
}
});
}
}
});
dlg.show(widget);
}
private final void willUpdateHierarchy(final HierarchyWidget hierWidget,
final XSubset oldSubset, final XAlias oldAlias,
final XElementNode[] oldVisibleElements,
final String oldPaths, final String oldAliasFormat,
final XElement oldSelectedElement) {
showWaitDialog(constants.updatingHierarchy());
final XAxisHierarchy hierarchy = hierWidget.getHierarchy();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().willUpdateAxisHierarchy(sessionId,
hierarchy,
new Callback<XLoadInfo>(constants.updatingHierarchyFailed()) {
public void onFailure(Throwable caught) {
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
//we cancel update:
hierarchy.setActiveAlias(oldAlias);
hierarchy.setActiveSubset(oldSubset);
hierarchy.setVisibleElements(oldVisibleElements);
hierarchy.setSelectedElement(oldSelectedElement);
if (oldPaths == null) {
hierarchy.removeProperty("filterPaths");
} else {
hierarchy.addProperty("filterPaths", oldPaths);
}
if (oldAliasFormat == null) {
hierarchy.removeProperty("aliasFormat");
} else {
hierarchy.addProperty("aliasFormat", oldAliasFormat);
}
updateHierarchy(hierarchy);
}
public void proceed(boolean state) {
proceedUpdateHierarchy(hierWidget, loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void willUpdateHierarchy(final XAxisHierarchy hierarchy,
final XSubset oldSubset, final XAlias oldAlias,
final XElementNode[] oldVisibleElements,
final String oldPaths,
final XElement oldSelectedElement) {
showWaitDialog(constants.updatingHierarchy());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().willUpdateAxisHierarchy(sessionId,
hierarchy,
new Callback<XLoadInfo>(constants.updatingHierarchyFailed()) {
public void onFailure(Throwable caught) {
hideWaitCursor();
super.onFailure(caught);
}
public void onSuccess(final XLoadInfo loadInfo) {
proceedUpdateHierarchy(hierarchy, loadInfo);
// ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
// public void cancel() {
// //we cancel update:
// hierarchy.setActiveAlias(oldAlias);
// hierarchy.setActiveSubset(oldSubset);
// hierarchy.setVisibleElements(oldVisibleElements);
// hierarchy.setSelectedElement(oldSelectedElement);
// if (oldPaths == null) {
// hierarchy.removeProperty("filterPaths");
// } else {
// hierarchy.addProperty("filterPaths", oldPaths);
// }
// updateHierarchy(hierarchy);
// }
// public void proceed(boolean state) {
//
// }
// };
// LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedUpdateHierarchy(final XAxisHierarchy hierarchy, XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
//PR 727: we have to update and reload view completely...
adjustView();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().updateAndReloadView(sessionId, view,
new Callback<XViewModel>(constants.updatingHierarchyFailed()) {
public void onSuccess(XViewModel xView) {
// editorPanel.saveState(view);
reset();
setInput(xView);
markDirty(true);
hideWaitCursor();
}
});
}
private final void proceedUpdateHierarchy(final HierarchyWidget hierWidget, XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
//PR 727: we have to update and reload view completely...
adjustView();
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().updateAndReloadView(sessionId, view,
new Callback<XViewModel>(constants.updatingHierarchyFailed()) {
public void onSuccess(XViewModel xView) {
// editorPanel.saveState(view);
reset();
setInput(xView);
markDirty(true);
hideWaitCursor();
}
});
}
private final void updateHierarchy(final XAxisHierarchy xAxisHierarchy) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().updateAxisHierarchy(sessionId,
xAxisHierarchy, new Callback<XElement>(constants.updatingHierarchyFailed()) {
public void onSuccess(XElement v) {
xAxisHierarchy.setSelectedElement(v);
hideWaitCursor();
}
});
}
protected String modify(String x) {
x = x.replaceAll("&", "&");
x = x.replaceAll("\"", """);
x = x.replaceAll("'", "'");
x = x.replaceAll("<", "<");
x = x.replaceAll(">", ">");
return x;
}
public final void markDirty(final boolean doIt) {
if (writeRight == -1 && view != null) {
XUser usr = ((Workbench)Registry.get(Workbench.ID)).getUser();
WPaloCubeViewServiceProvider.getInstance().isOwner(usr.getSessionId(), view.getId(), new AsyncCallback<Boolean>(){
public void onFailure(Throwable arg0) {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
isDirty = doIt;
Widget parent = getParent();
if(parent instanceof TabItem) {
TabItem tab = (TabItem) parent;
String title = doIt ? "*"+view.getName() : view.getName();
tab.setText(modify(title));
}
save.setEnabled(doIt);
}
if (writeRight == 0) {
save.setEnabled(false);
}
}
public void onSuccess(Boolean result) {
if (result) {
writeRight = 1;
isDirty = doIt;
Widget parent = getParent();
if(parent instanceof TabItem) {
TabItem tab = (TabItem) parent;
String title = doIt ? "*"+view.getName() : view.getName();
tab.setText(modify(title));
}
save.setEnabled(doIt);
} else {
XUser user = ((Workbench)Registry.get(Workbench.ID)).getUser();
writeRight = 0;
if (user.hasRoleName("EDITOR")) {
writeRight = 1;
isDirty = doIt;
Widget parent = getParent();
if(parent instanceof TabItem) {
TabItem tab = (TabItem) parent;
String title = doIt ? "*"+view.getName() : view.getName();
tab.setText(modify(title));
}
save.setEnabled(doIt);
}
if (writeRight == 0) {
save.setEnabled(false);
}
}
}
});
} else if (writeRight == 1) {
isDirty = doIt;
Widget parent = getParent();
if(parent instanceof TabItem) {
TabItem tab = (TabItem) parent;
String title = doIt ? "*"+view.getName() : view.getName();
tab.setText(modify(title));
}
save.setEnabled(doIt);
}
}
public void collapse(XAxisItem item, String viewId, String axisId,
boolean column) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().collapse(sessionId, item, viewId,
axisId, new Callback<Void>(messages.collapseItemFailed(item.getName())) {
public void onSuccess(Void v) {
}
});
}
private final void proceedWithCollapse(XAxisItem item, String viewId,
String axisId, final boolean column, XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedCollapse(sessionId, item, viewId, axisId,
new Callback<Void>(messages.collapseItemFailed(item.getName())) {
public void onSuccess(Void v) {
editorPanel.proceedCollapse();
markDirty(true);
hideWaitCursor();
}
});
}
private final void cancelCollapse(XAxisItem item, String viewId, String axisId, boolean column) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().cancelCollapse(sessionId, item, viewId,
axisId, new Callback<Void>(messages.expandingItemFailed(item.getName())) {
public void onSuccess(Void v) {
hideWaitCursor();
}
});
}
public void willCollapse(final XAxisItem item, final String viewId, final String axisId, final boolean column) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
showWaitDialog(messages.collapsingItem(item.getName()));
WPaloCubeViewServiceProvider.getInstance().willCollapse(sessionId, item, viewId, axisId,
new Callback<XLoadInfo>(messages.collapseItemFailed(item.getName())) {
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
cancelCollapse(item, viewId, axisId, column);
}
public void proceed(boolean state) {
proceedWithCollapse(item, viewId, axisId, column, loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
public void willExpand(final XAxisItem item, final String viewId, final String axisId,
final boolean column) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
showWaitDialog(messages.expandingItem(item.getName()));
WPaloCubeViewServiceProvider.getInstance().willExpand(sessionId, item, viewId, axisId,
new Callback<XLoadInfo>(messages.expandingItemFailed(item.getName())) {
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
cancelExpand(item, viewId, axisId, column);
}
public void proceed(boolean state) {
proceedWithExpand(item, viewId, axisId, column, loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedWithExpand(XAxisItem item, String viewId,
String axisId, final boolean column, XLoadInfo loadInfo) {
// if(loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedExpand(sessionId, item, viewId, axisId,
new Callback<XDelta>(messages.expandingItemFailed(item.getName())) {
public void onSuccess(XDelta delta) {
editorPanel.insert(delta, column);
markDirty(true);
hideWaitCursor();
}
});
}
private final void cancelExpand(XAxisItem item, String viewId, String axisId, boolean column) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().cancelExpand(sessionId, item, viewId,
axisId, new Callback<Void>(messages.collapseItemFailed(item.getName())) {
public void onSuccess(Void v) {
hideWaitCursor();
}
});
}
public void setExpandState(final XAxisItem[] expanded, final XAxisItem[] collapsed,
int expandDepth, final String viewId, String axisId, final boolean column) {
showWaitDialog(constants.expandingLevel());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().willSetExpandState(sessionId,
expanded, collapsed, expandDepth, viewId, axisId,
new Callback<XLoadInfo>(constants.settingExpandStateFailed()) {
public void onSuccess(final XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
cancelSetExpandState(viewId);
}
public void proceed(boolean state) {
proceedSetExpandState(viewId, column, loadInfo);
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
private final void proceedSetExpandState(String viewId,
final boolean column, XLoadInfo loadInfo) {
// if (loadInfo.loadCells > SHOW_WAIT_CURSOR_THRESHOLD)
showWaitDialog(constants.updatingView());
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().proceedSetExpandState(sessionId,
viewId, new Callback<XDelta[]>(constants.settingExpandStateFailed()) {
public void onSuccess(XDelta[] deltas) {
editorPanel.insert(deltas, column);
markDirty(true);
hideWaitCursor();
}
});
}
private final void cancelSetExpandState(String viewId) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().cancelSetExpandState(sessionId,
viewId,
new Callback<Void>(constants.settingExpandStateFailed()) {
public void onSuccess(Void v) {
hideWaitCursor();
}
});
}
final void checkWritePermission(AsyncCallback<Boolean> cb) {
String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().checkPermission(sessionId, view.getId(),
RIGHT_WRITE, cb);
}
public boolean layout() {
if (setupHandler != null) {
setupHandler.checkExpand();
}
return super.layout();
}
private final void hideElement(final XAxisItem item, final List <XAxisItem> roots, String viewId, String axisId, boolean column, boolean hideLevel) {
final String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
if (hideLevel) {
showWaitDialog(constants.hideLevel());
} else {
showWaitDialog(messages.hideElement(item.getName()));
}
WPaloCubeViewServiceProvider.getInstance().hideItem(sessionId, item, roots, viewId, axisId, column, hideLevel, new AsyncCallback <String []>(){
public void onFailure(Throwable t) {
System.err.println("Failed.");
t.printStackTrace();
hideWaitDialog();
}
public void onSuccess(final String [] result) {
WPaloCubeViewServiceProvider.getInstance().runAsync(sessionId, 0, new Callback<Void>() {
public void onSuccess(Void arg0) {
XAxisHierarchy hierarchy = view.getAxisHierarchy(item.getHierarchyId());
final String oldPaths = hierarchy.getProperty("filterPaths");
final String oldAliasFormat = hierarchy.getProperty("aliasFormat");
// get old settings:
final XAlias oldAlias = hierarchy.getActiveAlias();
final XSubset oldSubset = hierarchy.getActiveSubset();
final XElement oldSelectedElement = hierarchy.getSelectedElement();
ArrayList <XElementNode> visEls = new ArrayList<XElementNode>();
final XElementNode [] currentVisible = hierarchy.getVisibleElements();
hierarchy.setOldVisibleElements(currentVisible);
// //apply changes:
if (result != null) {
StringBuffer filterPaths = new StringBuffer();
HashMap <String, XElementNode> parents = new HashMap<String, XElementNode>();
int counter = 0;
for (int i = 0; i < result.length; i += 5) {
XElement xElement = new XElement(result[i], result[i + 1],
XElementType.fromString(result[i + 2]));
XElementNode xElemNode = new XElementNode(xElement, item.getHierarchyId(), view.getId());
filterPaths.append(result[i + 3]);
filterPaths.append(",");
if (!result[i + 4].equals("-1")) {
XElementNode xParent = parents.get(result[i + 4]);
xParent.forceAddChild(xElemNode);
xElemNode.setParent(xParent);
} else {
visEls.add(xElemNode);
}
parents.put("" + counter, xElemNode);
counter++;
}
hierarchy.addProperty("filterPaths", filterPaths.toString());
}
hierarchy.setVisibleElements(visEls.toArray(new XElementNode[0]));
willUpdateHierarchy(
hierarchy, oldSubset, oldAlias, currentVisible, oldPaths, oldSelectedElement);
}
});
}
});
}
private final boolean isHideAllowed(XAxisItem item, List <XAxisItem> siblings, boolean isLevel) {
if (siblings == null || siblings.isEmpty()) {
return item.isExpanded && item.hasChildren();
}
if (isLevel) {
for (XAxisItem i: siblings) {
if (i.isExpanded && i.hasChildren()) {
return true;
}
}
return false;
} else {
return siblings.size() > 1 || (item.isExpanded && item.hasChildren());
}
}
public void leftClicked(final XAxisItem item, final List <XAxisItem> roots, final String viewId, final String axisId,
final boolean column, int x, int y) {
Menu contextMenu = new Menu();
contextMenu.setWidth(140);
MenuItem hideElement = new MenuItem();
String name = item.getName();
if (name == null) {
name = constants.element();
}
if (name.length() > 15) {
name = name.substring(0, 12) + "...";
}
hideElement.setText(messages.hideElement(name));
hideElement.setIconStyle("icon-filter-remove");
hideElement.addSelectionListener(new SelectionListener<ComponentEvent>() {
public void componentSelected(ComponentEvent ce) {
if (item.depth != 0 || isHideAllowed(item, roots, false)) {
hideElement(item, null, viewId, axisId, column, false);
} else {
MessageBox.info(constants.information(),
constants.hideForbiddenLastElement(), null);
}
}
});
contextMenu.add(hideElement);
MenuItem hideLevel = new MenuItem();
hideLevel.setText(constants.hideLevel());
hideLevel.setIconStyle("icon-filter-remove-level");
hideLevel.addSelectionListener(new SelectionListener<ComponentEvent>() {
public void componentSelected(ComponentEvent ce) {
if (item.depth == 0) {
if (isHideAllowed(item, roots, true)) {
hideElement(item, roots, viewId, axisId, column, true);
} else {
MessageBox.info(constants.information(),
constants.hideForbidden(), null);
}
} else {
hideElement(item, null, viewId, axisId, column, true);
}
}
});
contextMenu.add(hideLevel);
XAxisHierarchy hierarchy = view.getAxisHierarchy(item.getHierarchyId());
boolean enabled = hierarchy != null && hierarchy.getVisibleElements() != null && hierarchy.getVisibleElements().length > 0;
MenuItem showAllElements = new MenuItem();
showAllElements.setText(constants.showAllElements());
showAllElements.setIconStyle("icon-filter");
showAllElements.addSelectionListener(new SelectionListener<ComponentEvent>() {
public void componentSelected(ComponentEvent ce) {
XAxisHierarchy hierarchy = view.getAxisHierarchy(item.getHierarchyId());
final String oldPaths = hierarchy.getProperty("filterPaths");
// get old settings:
final XAlias oldAlias = hierarchy.getActiveAlias();
final XSubset oldSubset = hierarchy.getActiveSubset();
final XElement oldSelectedElement = hierarchy.getSelectedElement();
ArrayList <XElementNode> visEls = new ArrayList<XElementNode>();
final XElementNode [] currentVisible = hierarchy.getVisibleElements();
hierarchy.setOldVisibleElements(currentVisible);
hierarchy.setVisibleElements(null);
willUpdateHierarchy(
hierarchy, oldSubset, oldAlias, currentVisible, oldPaths, oldSelectedElement);
}
});
contextMenu.add(showAllElements);
showAllElements.setEnabled(enabled);
contextMenu.showAt(x, y);
}
public void rightClicked(XAxisItem item, List <XAxisItem> roots, String viewId, String axisId,
boolean column, int x, int y) {
// TODO Auto-generated method stub
}
public void onClick(ClickEvent ignored) {
showWaitDialog(constants.updatingView());
final String sessionId = ((Workbench)Registry.get(Workbench.ID)).getUser().getSessionId();
WPaloCubeViewServiceProvider.getInstance().willSwapAxes(sessionId, view.getId(), new Callback<XLoadInfo>() {
public void onSuccess(XLoadInfo loadInfo) {
ConfirmLoadDialogListener dlgListener = new ConfirmLoadDialogListener() {
public void cancel() {
hideWaitCursor();
}
public void proceed(boolean state) {
removeLocalFilter();
view.setNeedsRestore(true);
WPaloCubeViewServiceProvider.getInstance().proceedSwapAxes(sessionId, view, new Callback<XViewModel>() {
public void onSuccess(XViewModel view) {
restoreLocalFilter(view);
view.setNeedsRestore(false);
reset();
setInput(view);
markDirty(true);
hideWaitCursor();
}
});
}
};
LargeQueryWarningDialog.confirm(loadInfo, dlgListener);
}
});
}
}
class SetupHandler implements Listener<BaseEvent> {
protected transient final ILocalConstants constants = Resources.getInstance().getConstants();
private final BorderLayout layout;
private final Component managedComponent;
private final CubeViewEditor editor;
private final LayoutRegion region;
private boolean initiallyExpand = false;
private boolean setupDone = false;
private int lastWidth = 0;
SetupHandler(CubeViewEditor editor, LayoutRegion region) {
this.editor = editor;
this.region = region;
this.layout = (BorderLayout)editor.getLayout();
this.managedComponent = getRegionWidget(region);
if (managedComponent != null) {
//managedComponent.setVisible(!editor.displayFlags.isHideStaticFilter());
if (editor.displayFlags.isHideStaticFilter()) {
managedComponent.hide();
}
}
layout.addListener(Events.AfterLayout, this);
}
void setupDone() {
layout.removeListener(Events.AfterLayout, this);
managedComponent.addListener(Events.Resize,
new Listener<BoxComponentEvent>() {
public void handleEvent(BoxComponentEvent be) {
if (setupDone) {
int variance = Math.abs(be.width - lastWidth);
if (variance > 3)
editor.markDirty(true);
}
lastWidth = be.width;
}
});
setupDone = true;
}
void checkExpand() {
if(setupDone && isExpand()) {
//expand only if we have enough permission:
expandOnPermission();
}
}
private final boolean isExpand() {
Map<String, Object> state = managedComponent.getState();
return !state.containsKey("collapsed") && !editor.displayFlags.isHideStaticFilter();
}
private final void expandOnPermission() {
if (editor.displayFlags.isHideStaticFilter()) {
return;
}
if (initiallyExpand) //we are allow to expand if it was initially expanded...
expand(true);
else { //check write permission...
int writePermission = editor.getWritePermission();
if (writePermission == -1) {
editor.checkWritePermission(new Callback<Boolean>() {
public void onSuccess(Boolean granted) {
if (!granted) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToModifyStaticFilters(), null);
}
expand(granted);
}
});
} else {
if (writePermission != 1) {
MessageBox.alert(constants.notEnoughRights(),
constants.notEnoughRightsToModifyStaticFilters(), null);
}
expand(writePermission == 1);
}
}
}
private void expand(boolean doIt) {
if(doIt)
layout.expand(region);
else
layout.collapse(region);
}
private Component getRegionWidget(LayoutRegion region) {
for (int i = 0, n = editor.getItemCount(); i < n; ++i) {
Component c = editor.getItem(i);
Object data = c.getData("layout_region");
if (data != null && data.equals(region))
return c;
}
return null;
}
/** called from editor whenever a region is expanded or collapsed */
void regionExpanded() {
if(setupDone) {
editor.markDirty(true);
}
}
void setupWidth(int width) {
if(setupDone)
return;
lastWidth = width;
initiallyExpand = width > 0 ? true : false;
expand(initiallyExpand && !editor.displayFlags.isHideStaticFilter());
if(initiallyExpand && !editor.displayFlags.isHideStaticFilter()) {
BorderLayoutData layoutData = (BorderLayoutData)
ComponentHelper.getLayoutData(managedComponent);
layoutData.setSize(width);
editor.checkDnDState();
}
}
public void handleEvent(BaseEvent be) {
if (be.type == Events.AfterLayout) {
if(!setupDone)
setup();
}
}
private final void setup() {
if(initiallyExpand) {
layout.expand(region);
editor.checkDnDState();
} else {
layout.collapse(region);
}
}
}