package org.gcube.portlets.user.reportgenerator.client.targets; import org.gcube.portlets.d4sreporting.common.client.ComponentType; import org.gcube.portlets.user.reportgenerator.client.ReportGenerator; import org.gcube.portlets.user.reportgenerator.client.Presenter.Presenter; import com.extjs.gxt.ui.client.widget.MessageBox; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.event.dom.client.KeyUpEvent; import com.google.gwt.event.dom.client.KeyUpHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.event.dom.client.MouseOutEvent; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.HasVerticalAlignment; import com.google.gwt.user.client.ui.RichTextArea; import com.google.gwt.user.client.ui.TextArea; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; /** * D4sRichTextArea class is a template component that goes into the workspace * * @author Massimiliano Assante, ISTI-CNR - massimiliano.assante@isti.cnr.it * @version October 2008 (0.2) */ public class D4sRichTextarea extends ReportTextArea { /** * the text area */ private RichTextArea area = new RichTextArea(); TextArea text = new TextArea(); /** * a flag */ boolean firstClick = true; int currHeight = 0; VerticalPanel myPanel; /** * * */ public D4sRichTextarea() {} /** * * @param presenter . * @param left left * @param top top * @param width . * @param height . * @param type . */ public D4sRichTextarea(ComponentType type, final Presenter presenter, int left, int top, int width, final int height, boolean hasComments) { super(type, presenter, left, top, width, height, hasComments); currHeight = height; myPanel = getResizablePanel(); area.setPixelSize(width-6, height-2); area.setStyleName("d4sRichTextArea"); switch (type) { case TITLE: area.addStyleName(""); break; case HEADING_1: area.addStyleName(""); break; case HEADING_2: area.addStyleName(""); break; case HEADING_3: area.addStyleName(""); break; case BODY: area.addStyleName("bodyArea"); break; default: break; } myPanel.add(area); //repositionMyPanel(0, 15); myPanel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); myPanel.setPixelSize(width, height-15); setStyleName("d4sFrame"); area.addMouseDownHandler(new MouseDownHandler() { public void onMouseDown(MouseDownEvent event) { if (event.getNativeButton() == Event.BUTTON_RIGHT) { event.preventDefault(); event.stopPropagation(); MessageBox.alert("Warning","Please, use CTRL+V (CMD+V) for pasting into this area", null); } if (firstClick) { presenter.enableTextToolBar(area); presenter.enableBiblioEntry(area); firstClick = false; ReportGenerator.get().getDivHidden().setPixelSize(area.getOffsetWidth(), -1); } HTML div = ReportGenerator.get().getDivHidden(); div.setHTML(area.getHTML()); int newHeight = div.getOffsetHeight()+20 ; if (newHeight > height-10 && newHeight != currHeight) { presenter.shiftComponentsByTextArea(myInstance.top, newHeight - currHeight); resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); //Window.alert("myInstance.top: " + myInstance.top); presenter.resizeTemplateComponentInModel(myInstance, myPanel.getOffsetWidth(), newHeight); } } }); area.addMouseOutHandler(new MouseOutHandler() { public void onMouseOut(MouseOutEvent event) { firstClick = true; presenter.storeChangeInSession((Widget) event.getSource()); } }); //TODO: aggiorna // area.addKeyDownHandler(new KeyDownHandler() { // public void onKeyDown(KeyDownEvent event) { //// if (event.isAnyModifierKeyDown() && event.getNativeKeyCode() == 86) { //event.getNativeKeyCode() == 86 is the V (to avoid ctrl V or cmd V) //// MessageBox.show(new MessageBoxConfig() { //// { //// setTitle("Paste operation"); //// setMsg("Please enter your text here (PLAIN)"); //// setWidth(500); //// setButtons(MessageBox.OKCANCEL); //// setMultiline(true); //// setCallback(new MessageBox.PromptCallback() { //// public void execute(String btnID, String text) { //// if (btnID.compareTo("ok") == 0) { //// area.setText(text); //// //// //resize if needed //// HTML div = ReportGenerator.get().getDivHidden(); //// //GWT.log("element.getHTML():\n" + area.getHTML(), null); //// div.setHTML(area.getHTML()); //// int newHeight = div.getOffsetHeight()+20 ; //// if (newHeight > height-10 && newHeight != currHeight) { //// resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); //// } //// } //// //// } //// }); //// } //// }); // event.stopPropagation(); // event.preventDefault(); // } // // } // }); area.addKeyUpHandler(new KeyUpHandler() { public void onKeyUp(KeyUpEvent event) { HTML div = ReportGenerator.get().getDivHidden(); div.setHTML(area.getHTML()); int newHeight = div.getOffsetHeight()+20 ; if (newHeight > height-10 && newHeight != currHeight) { presenter.shiftComponentsByTextArea(myInstance.top, newHeight - currHeight); resizePanel(myPanel.getOffsetWidth(), div.getOffsetHeight()); //Window.alert("myInstance.top: " + myInstance.top); presenter.resizeTemplateComponentInModel(myInstance, myPanel.getOffsetWidth(), newHeight); } } }); } /** * used to resize the panel * @param width w * @param height h */ @Override public void resizePanel(int width, int height) { if (height > 15 && width > 15) { mainPanel.setPixelSize(width, height+20); resizablePanel.setPixelSize(width, height+20); mainPanel.setWidgetPosition(topPanel, width-30 , 0); area.setPixelSize(width-4, height+20); currHeight = height + 20; } } /** * * @return . */ public String getHTML() { return area.getHTML(); } /** * @param html the html */ public void setHTML(String html) { area.setHTML(html); } /** * * @return . */ public RichTextArea getArea() { return area; } /** * * @param firstClick . */ public void setFirstClick(boolean firstClick) { this.firstClick = firstClick; } }