/*
* Copyright (c) 2010-2011 Lockheed Martin Corporation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.eurekastreams.web.client.ui.pages.start;
import java.util.ArrayList;
import java.util.List;
import org.eurekastreams.server.action.request.start.RenameTabRequest;
import org.eurekastreams.server.domain.GadgetDefinition;
import org.eurekastreams.server.domain.Tab;
import org.eurekastreams.server.domain.TabTemplate;
import org.eurekastreams.web.client.events.GadgetAddedToStartPageEvent;
import org.eurekastreams.web.client.events.Observer;
import org.eurekastreams.web.client.events.UpdateHistoryEvent;
import org.eurekastreams.web.client.events.data.UpdatedStartPageLayoutResponseEvent;
import org.eurekastreams.web.client.events.data.UpdatedStartPageTabNameResponseEvent;
import org.eurekastreams.web.client.history.CreateUrlRequest;
import org.eurekastreams.web.client.jsni.GadgetMetaDataFetcher;
import org.eurekastreams.web.client.jsni.WidgetJSNIFacadeImpl;
import org.eurekastreams.web.client.model.StartTabsModel;
import org.eurekastreams.web.client.ui.Session;
import org.eurekastreams.web.client.ui.common.tabs.SimpleTab;
import org.eurekastreams.web.client.ui.pages.master.StaticResourceBundle;
import org.eurekastreams.web.client.ui.pages.start.layouts.TabLayoutSelectorPanel;
import com.google.gwt.event.dom.client.BlurEvent;
import com.google.gwt.event.dom.client.BlurHandler;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
/**
* The start page tab extends the simpletab and adds a menu and the ability to rename, delete, and change layout.
*
*/
public class StartPageTab extends SimpleTab
{
/**
* The tab layout selector panel.
*/
TabLayoutSelectorPanel tabLayoutSelectorPanel;
/**
* The textbox the user inserts a new tab name or rename into.
*/
TextBox textBox = new TextBox();
/**
* The domain model object the tabcomposite gets its info from.
*/
Tab tab = null;
/**
* The tab menu bar.
*/
MenuBar menuItems = new MenuBar(true);
/**
* The menu.
*/
MenuBar menu = new MenuBar();
/**
* JSNI Facade.
*/
WidgetJSNIFacadeImpl jSNIFacade = new WidgetJSNIFacadeImpl();
/**
* The remove item.
*/
MenuItem removeItem;
/**
* Am I active?
*/
boolean isActive = false;
/**
* No Blur.
*/
boolean noBlur = false;
/**
* The empty constructor is used for making a tabcomposite with now tab entity. The result is a tabcomposite with a
* new text box in it.
*/
public StartPageTab()
{
super("+");
textBox.addStyleName(StaticResourceBundle.INSTANCE.coreCss().newTabTextbox());
textBox.setMaxLength(TabTemplate.MAX_TAB_NAME_LENGTH);
getPanel().add(textBox);
textBox.setVisible(false);
textBox.setText("New Tab");
getFocusPanel().addClickHandler(new ClickHandler()
{
public void onClick(final ClickEvent event)
{
textBox.setText("New Tab");
textBox.setVisible(true);
textBox.selectAll();
textBox.setFocus(true);
getLabel().setVisible(false);
}
});
textBox.addBlurHandler(new BlurHandler()
{
public void onBlur(final BlurEvent event)
{
if (!noBlur)
{
StartTabsModel.getInstance().insert(textBox.getText());
}
noBlur = false;
}
});
textBox.addKeyPressHandler(new KeyPressHandler()
{
public void onKeyPress(final KeyPressEvent event)
{
if (event.getCharCode() == KeyCodes.KEY_ENTER)
{
noBlur = true;
StartTabsModel.getInstance().insert(textBox.getText());
}
if (event.getCharCode() == KeyCodes.KEY_ESCAPE)
{
noBlur = true;
textBox.setVisible(false);
getLabel().setVisible(true);
}
}
});
}
/**
* This constructor makes a tabcomposite with a tab entity.
*
* @param inTab
* the domain model object to populate the tab composite with.
*/
public StartPageTab(final Tab inTab)
{
super(inTab.getTabName());
setContents(new StartPageTabContent(inTab));
tab = inTab;
menu.addItem("X", menuItems);
menu.addStyleName(StaticResourceBundle.INSTANCE.coreCss().tabMenu());
getPanel().add(menu);
textBox.addStyleName(StaticResourceBundle.INSTANCE.coreCss().newTabTextbox());
textBox.setMaxLength(TabTemplate.MAX_TAB_NAME_LENGTH);
textBox.addBlurHandler(new BlurHandler()
{
public void onBlur(final BlurEvent event)
{
tab.setTabName(textBox.getText());
StartTabsModel.getInstance().rename(new RenameTabRequest(tab.getId(), textBox.getText()));
getPanel().remove(textBox);
getPanel().add(getLabel());
getPanel().add(menu);
}
});
textBox.addKeyUpHandler(new KeyUpHandler()
{
public void onKeyUp(final KeyUpEvent ev)
{
if (ev.getNativeKeyCode() == KeyCodes.KEY_ENTER && !ev.isAnyModifierKeyDown())
{
tab.setTabName(textBox.getText());
StartTabsModel.getInstance().rename(new RenameTabRequest(tab.getId(), textBox.getText()));
}
}
});
menuItems.addItem("Change Layout", new Command()
{
public void execute()
{
((StartPageTabContent) getContents()).showTabLayoutSelector();
}
});
menuItems.addItem("Rename Tab", new Command()
{
public void execute()
{
getPanel().remove(getLabel());
getPanel().remove(menu);
getPanel().add(textBox);
textBox.setText(getLabel().getText());
textBox.setFocus(true);
textBox.setSelectionRange(0, textBox.getText().length());
}
});
removeItem = new MenuItem("Remove", new Command()
{
public void execute()
{
StartTabsModel.getInstance().delete(tab);
}
});
menuItems.addItem(removeItem);
Session.getInstance().getEventBus().addObserver(UpdatedStartPageTabNameResponseEvent.class,
new Observer<UpdatedStartPageTabNameResponseEvent>()
{
public void update(final UpdatedStartPageTabNameResponseEvent event)
{
if (event.getResponse() == tab.getId())
{
getLabel().setText(textBox.getText());
getPanel().remove(textBox);
getPanel().add(getLabel());
getPanel().add(menu);
}
}
});
Session.getInstance().getEventBus().addObserver(UpdatedStartPageLayoutResponseEvent.class,
new Observer<UpdatedStartPageLayoutResponseEvent>()
{
public void update(final UpdatedStartPageLayoutResponseEvent event)
{
if (event.getResponse().getId() == tab.getId())
{
((StartPageTabContent) getContents()).renderGadgetContainer(event.getResponse());
((StartPageTabContent) getContents()).renderGadgets();
((StartPageTabContent) getContents()).refreshGadgetMetadata();
}
}
});
Session.getInstance().getEventBus().addObserver(GadgetAddedToStartPageEvent.class,
new Observer<GadgetAddedToStartPageEvent>()
{
public void update(final GadgetAddedToStartPageEvent event)
{
if (isActive)
{
((StartPageTabContent) getContents()).insertGadget(event.getGadget(), true);
Session.getInstance().getEventBus().notifyObservers(
new UpdateHistoryEvent(new CreateUrlRequest("action", null, false)));
// fetch metadata again to force reevaluation of metadata
// (for making sure "edit settings" is hidden, if necessary)
List<GadgetDefinition> gadgetDefList = new ArrayList<GadgetDefinition>();
gadgetDefList.add(event.getGadget().getGadgetDefinition());
(new GadgetMetaDataFetcher(gadgetDefList)).fetchMetaData();
}
}
});
}
/**
* @return tab the tab.
*/
public Tab getTab()
{
return tab;
}
/**
* Disable the remove button.
*/
public void disableRemove()
{
menuItems.removeItem(removeItem);
}
/**
* Enable the remove button.
*/
public void enableRemove()
{
menuItems.addItem(removeItem);
}
/**
* Set's the tab's CSS style to be inactive.
*/
@Override
public void unSelect()
{
super.unSelect();
isActive = false;
if (getContents() != null && getContents() instanceof StartPageTabContent)
{
((StartPageTabContent) getContents()).hideTabLayoutSelector();
}
}
@Override
public void select()
{
super.select();
isActive = true;
Session.getInstance().setPageTitle(tab.getTabName());
if (getContents() != null && getContents() instanceof StartPageTabContent)
{
((StartPageTabContent) getContents()).renderGadgets();
if (((StartPageTabContent) getContents()).isAnyGadgetMaximized())
{
RootPanel.get().addStyleName(StaticResourceBundle.INSTANCE.coreCss().maximizedGadget());
}
else
{
RootPanel.get().removeStyleName(StaticResourceBundle.INSTANCE.coreCss().maximizedGadget());
}
}
}
@Override
public String getIdentifier()
{
if (tab == null)
{
return null;
}
else
{
return String.valueOf(tab.getId());
}
}
/**
* Get the textbox.
*
* @return the textbox.
*/
public TextBox getTextBox()
{
return textBox;
}
}