[jboss-svn-commits] JBL Code SVN: r36002 - in labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client: images and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Wed Nov 17 04:47:55 EST 2010
Author: jervisliu
Date: 2010-11-17 04:47:55 -0500 (Wed, 17 Nov 2010)
New Revision: 36002
Added:
labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ScrollTabLayoutPanel.java
labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollleft.gif
labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollright.gif
Modified:
labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java
labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/Images.java
Log:
https://jira.jboss.org/browse/GUVNOR-1074: List open tabs in a menu style list. Due to a truncating problem when displaying MenuBar in tabBar, I have to use scroll button instead.
Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java 2010-11-17 09:38:03 UTC (rev 36001)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ExplorerViewCenterPanel.java 2010-11-17 09:47:55 UTC (rev 36002)
@@ -48,7 +48,7 @@
public class ExplorerViewCenterPanel extends Composite {
private static Images images = (Images) GWT.create( Images.class );
- private final TabLayoutPanel tabLayoutPanel;
+ private final ScrollTabLayoutPanel tabLayoutPanel;
private MultiKeyMap<Panel> openedTabs = new MultiKeyMap<Panel>();
private static int id = 0;
@@ -60,8 +60,8 @@
private Map<Panel, String[]> itemWidgets = new HashMap<Panel, String[]>();
public ExplorerViewCenterPanel() {
- tabLayoutPanel = new TabLayoutPanel( 2,
- Unit.EM );
+ tabLayoutPanel = new ScrollTabLayoutPanel( 2,
+ Unit.EM);
initWidget( tabLayoutPanel );
}
Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ScrollTabLayoutPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ScrollTabLayoutPanel.java (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/ScrollTabLayoutPanel.java 2010-11-17 09:47:55 UTC (rev 36002)
@@ -0,0 +1,212 @@
+package org.drools.guvnor.client.explorer;
+
+import org.drools.guvnor.client.images.Images;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.dom.client.Style.Unit;
+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.layout.client.Layout.Alignment;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.FlowPanel;
+import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.LayoutPanel;
+import com.google.gwt.user.client.ui.TabLayoutPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+public class ScrollTabLayoutPanel extends TabLayoutPanel {
+ private static Images images = (Images) GWT.create( Images.class );
+
+ private Image scrollLeft;
+ private Image scrollRight;
+ private FlowPanel tabBar = null;
+ private LayoutPanel panel;
+ private static final int ScrollLengh = 100;
+
+ private double barHeight;
+ private Unit barUnit;
+ private boolean isScrollingEnabled = false;
+
+ private HandlerRegistration windowResizeHandler;
+
+ public ScrollTabLayoutPanel(double barHeight, Unit barUnit) {
+ super(barHeight, barUnit);
+ this.barHeight = barHeight;
+ this.barUnit = barUnit;
+ this.panel = (LayoutPanel) getWidget();
+
+ for (int i = 0; i < panel.getWidgetCount(); ++i) {
+ Widget widget = panel.getWidget(i);
+ if (widget instanceof FlowPanel) {
+ tabBar = (FlowPanel) widget;
+ break;
+ }
+ }
+ }
+
+ @Override
+ public void add(Widget child, Widget tab) {
+ super.add(child, tab);
+ checkIfScrollButtonsNecessary();
+ }
+
+ @Override
+ public boolean remove(Widget w) {
+ boolean b = super.remove(w);
+ checkIfScrollButtonsNecessary();
+ return b;
+ }
+
+ @Override
+ public boolean remove(int index) {
+ boolean b = super.remove(index);
+ checkIfScrollButtonsNecessary();
+ return b;
+ }
+
+ @Override
+ protected void onLoad() {
+ super.onLoad();
+
+ if (windowResizeHandler == null) {
+ windowResizeHandler = Window.addResizeHandler(new ResizeHandler() {
+ public void onResize(ResizeEvent event) {
+ checkIfScrollButtonsNecessary();
+ }
+ });
+ }
+ }
+
+ @Override
+ protected void onUnload() {
+ super.onUnload();
+
+ if (windowResizeHandler != null) {
+ windowResizeHandler.removeHandler();
+ windowResizeHandler = null;
+ }
+ }
+
+ private void enableScroll() {
+ if (!isScrollingEnabled) {
+ scrollRight = new Image(images.scrollRight());
+ scrollLeft = new Image(images.scrollLeft());
+ scrollLeft.addClickHandler(createScrollClickHandler(ScrollLengh));
+ scrollRight.addClickHandler(createScrollClickHandler(-ScrollLengh));
+
+ panel.setWidgetLeftRight(tabBar, 30, Unit.PX, 30, Unit.PX);
+ panel.setWidgetTopHeight(tabBar, 0, Unit.PX, barHeight, barUnit);
+ panel.setWidgetVerticalPosition(tabBar, Alignment.END);
+
+ panel.add(scrollRight);
+ panel.setWidgetRightWidth(scrollRight, 0, Unit.PX, 27, Unit.PX);
+ panel.setWidgetTopHeight(scrollRight, 0, Unit.PX, barHeight,
+ barUnit);
+ panel.setWidgetVerticalPosition(scrollRight, Alignment.END);
+
+ panel.add(scrollLeft);
+ panel.setWidgetLeftWidth(scrollLeft, 0, Unit.PX, 27, Unit.PX);
+ panel.setWidgetTopHeight(scrollLeft, 0, Unit.PX, barHeight, barUnit);
+ panel.setWidgetVerticalPosition(scrollLeft, Alignment.END);
+
+ isScrollingEnabled = true;
+ }
+ }
+
+ private void disableScroll() {
+ if (isScrollingEnabled) {
+ panel.remove(scrollRight);
+ panel.remove(scrollLeft);
+
+ panel.setWidgetLeftRight(tabBar, 0, Unit.PX, 0, Unit.PX);
+ panel.setWidgetTopHeight(tabBar, 0, Unit.PX, barHeight, barUnit);
+ panel.setWidgetVerticalPosition(tabBar, Alignment.END);
+
+ isScrollingEnabled = false;
+ }
+ }
+
+ private void checkIfScrollButtonsNecessary() {
+ // Defer size calculations until sizes are available, when calculating
+ // immediately after add(), all size methods return zero
+ Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() {
+ public void execute() {
+ boolean isScrolling = isScrollingNecessary();
+ if(isScrolling) {
+ enableScroll();
+ } else {
+ disableScroll();
+ }
+ }
+ });
+ }
+
+ private boolean isScrollingNecessary() {
+ Widget lastTab = getLastTab();
+ if (lastTab == null)
+ return false;
+
+ return getRightOfWidget(lastTab) > getTabBarWidth();
+ }
+
+ private ClickHandler createScrollClickHandler(final int diff) {
+ return new ClickHandler() {
+ public void onClick(ClickEvent event) {
+ Widget lastTab = getLastTab();
+ if (lastTab == null)
+ return;
+
+ int newLeft = parsePosition(tabBar.getElement().getStyle().getLeft()) + diff;
+ int rightOfLastTab = getRightOfWidget(lastTab);
+
+ // Prevent scrolling the last tab too far away form the right
+ // border, or the first tab further than the left border position
+ if (newLeft <= 0
+ && (getTabBarWidth() - newLeft < (rightOfLastTab + ScrollLengh))) {
+ scrollTo(newLeft);
+ }
+ }
+ };
+ }
+
+ private void scrollTo(int pos) {
+ tabBar.getElement().getStyle().setLeft(pos, Unit.PX);
+ }
+
+ private int getRightOfWidget(Widget widget) {
+ return widget.getElement().getOffsetLeft()
+ + widget.getElement().getOffsetWidth();
+ }
+
+ private int getTabBarWidth() {
+ return tabBar.getElement().getParentElement().getClientWidth();
+ }
+
+ private Widget getLastTab() {
+ if (tabBar.getWidgetCount() == 0)
+ return null;
+
+ return tabBar.getWidget(tabBar.getWidgetCount() - 1);
+ }
+
+ private static int parsePosition(String positionString) {
+ int position;
+ try {
+ for (int i = 0; i < positionString.length(); i++) {
+ char c = positionString.charAt(i);
+ if (c != '-' && !(c >= '0' && c <= '9')) {
+ positionString = positionString.substring(0, i);
+ }
+ }
+
+ position = Integer.parseInt(positionString);
+ } catch (NumberFormatException ex) {
+ position = 0;
+ }
+ return position;
+ }
+}
Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/Images.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/Images.java 2010-11-17 09:38:03 UTC (rev 36001)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/Images.java 2010-11-17 09:47:55 UTC (rev 36002)
@@ -133,4 +133,10 @@
@Source("close.gif")
ImageResource close();
+
+ @Source("scrollleft.gif")
+ ImageResource scrollLeft();
+
+ @Source("scrollright.gif")
+ ImageResource scrollRight();
}
\ No newline at end of file
Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollleft.gif
===================================================================
(Binary files differ)
Property changes on: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollleft.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollright.gif
===================================================================
(Binary files differ)
Property changes on: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/images/scrollright.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
More information about the jboss-svn-commits
mailing list