/* * Ext GWT - Ext for GWT * Copyright(c) 2007-2009, Ext JS, LLC. * licensing@extjs.com * * http://extjs.com/license */ package com.extjs.gxt.samples.client.examples.organizer; import java.util.List; import com.extjs.gxt.samples.client.ExampleService; import com.extjs.gxt.samples.client.ExampleServiceAsync; import com.extjs.gxt.samples.client.examples.model.Photo; import com.extjs.gxt.samples.resources.client.Resources; import com.extjs.gxt.ui.client.Style.LayoutRegion; import com.extjs.gxt.ui.client.Style.Scroll; import com.extjs.gxt.ui.client.data.BaseListLoader; import com.extjs.gxt.ui.client.data.BaseModelData; import com.extjs.gxt.ui.client.data.BeanModel; import com.extjs.gxt.ui.client.data.BeanModelReader; import com.extjs.gxt.ui.client.data.ListLoadResult; import com.extjs.gxt.ui.client.data.ListLoader; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.dnd.ListViewDragSource; import com.extjs.gxt.ui.client.dnd.TreePanelDropTarget; import com.extjs.gxt.ui.client.dnd.DND.Feedback; import com.extjs.gxt.ui.client.dnd.DND.Operation; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.DNDEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.util.Format; import com.extjs.gxt.ui.client.util.IconHelper; import com.extjs.gxt.ui.client.util.Margins; 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.ListView; import com.extjs.gxt.ui.client.widget.MessageBox; import com.extjs.gxt.ui.client.widget.button.Button; 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.toolbar.ToolBar; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.TreeNode; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.rpc.ServiceDefTarget; public class ImageOrganizerExample extends LayoutContainer { private TreePanel<ModelData> tree; @Override protected void onRender(Element parent, int index) { super.onRender(parent, index); LayoutContainer container = new LayoutContainer(); container.setStyleAttribute("margin", "20px"); container.setSize(650, 300); container.setBorders(true); container.setLayout(new BorderLayout()); ContentPanel west = new ContentPanel(); west.setHeading("My Albums"); ToolBar toolBar = new ToolBar(); Button newAlbum = new Button("New Album"); newAlbum.setIcon(Resources.ICONS.album()); newAlbum.addSelectionListener(new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { MessageBox.prompt("New Album", "Enter the new album name:", new Listener<MessageBoxEvent>() { public void handleEvent(MessageBoxEvent be) { if (be.getButtonClicked().getItemId().equals(Dialog.OK) && be.getValue() != null) { tree.getStore().add(createAlbum(be.getValue()), false); tree.setLeaf(tree.getStore().getRootItems().get( tree.getStore().getRootItems().size() - 1), false); } } }); } }); toolBar.add(newAlbum); west.setTopComponent(toolBar); TreeStore<ModelData> treeStore = new TreeStore<ModelData>(); tree = new TreePanel<ModelData>(treeStore); tree.setDisplayProperty("name"); tree.getStyle().setLeafIcon(IconHelper.create("user")); tree.getStyle().setNodeCloseIcon(IconHelper.create("icon-album")); tree.getStyle().setNodeOpenIcon(IconHelper.create("icon-album")); west.add(tree); treeStore.add(createAlbum("Album 1"), false); tree.setLeaf(treeStore.getRootItems().get(0), false); BorderLayoutData westData = new BorderLayoutData(LayoutRegion.WEST, 200, 100, 300); westData.setMargins(new Margins(5, 0, 5, 5)); westData.setSplit(true); container.add(west, westData); ContentPanel center = new ContentPanel(); center.setHeading("My Images"); center.setScrollMode(Scroll.AUTO); BorderLayoutData centerData = new BorderLayoutData(LayoutRegion.CENTER); centerData.setMargins(new Margins(5)); container.add(center, centerData); final ExampleServiceAsync service = (ExampleServiceAsync) GWT.create(ExampleService.class); ServiceDefTarget endpoint = (ServiceDefTarget) service; String moduleRelativeURL = GWT.getModuleBaseURL() + "service"; endpoint.setServiceEntryPoint(moduleRelativeURL); RpcProxy<List<Photo>> proxy = new RpcProxy<List<Photo>>() { @Override protected void load(Object loadConfig, AsyncCallback<List<Photo>> callback) { service.getPhotos(callback); } }; ListLoader<ListLoadResult<BeanModel>> loader = new BaseListLoader<ListLoadResult<BeanModel>>( proxy, new BeanModelReader()); ListStore<BeanModel> store = new ListStore<BeanModel>(loader); loader.load(); ListView<BeanModel> view = new ListView<BeanModel>() { @Override protected BeanModel prepareData(BeanModel model) { Photo photo = model.getBean(); long size = photo.getSize() / 1000; model.set("shortName", Format.ellipse(photo.getName(), 15)); model.set("sizeString", NumberFormat.getFormat("#0").format(size) + "k"); model.set("dateString", DateTimeFormat.getMediumDateTimeFormat().format( photo.getDate())); return model; } }; view.setId("img-chooser-view"); view.setTemplate(getTemplate()); view.setBorders(false); view.setStore(store); view.setItemSelector("div.thumb-wrap"); center.add(view); new ListViewDragSource(view); TreePanelDropTarget target = new TreePanelDropTarget(tree) { @SuppressWarnings("unchecked") @Override protected void handleAppendDrop(DNDEvent event, TreeNode item) { List<BeanModel> sel = event.getData(); for (BeanModel bean : sel) { ModelData m = new BaseModelData(); for (String s : bean.getPropertyNames()) { m.set(s, bean.get(s)); } tree.getStore().add(item.getModel(), m, false); } } }; target.setOperation(Operation.COPY); target.setFeedback(Feedback.APPEND); add(container); } private native String getTemplate() /*-{ return ['<tpl for=".">', '<div class="thumb-wrap" id="{name}" style="border: 1px solid white">', '<div class="thumb"><img src="{path}" title="{name}"></div>', '<span>{shortName}</span></div>', '</tpl>'].join(""); }-*/; private ModelData createAlbum(String name) { ModelData m = new BaseModelData(); m.set("name", name); return m; } }