/*******************************************************************************
 * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc.
 * Distributed under license by Red Hat, Inc. All rights reserved.
 * This program is made available under the terms of the
 * Eclipse Public License v1.0 which accompanies this distribution,
 * and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Exadel, Inc. and Red Hat, Inc. - initial API and implementation
 ******************************************************************************/ 
package org.jboss.tools.jsf.ui.editor.print;


import java.awt.Dimension;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Scale;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

import org.jboss.tools.jsf.messages.JSFUIMessages;
import org.jboss.tools.jsf.ui.editor.JSFEditor;

public class PrintPreviewDialog extends Dialog{
			String message = ""; //$NON-NLS-1$
			String result = null;
			Shell dialog;
			Text text;
			Display display;
			GraphicalViewer viewer;
			JSFEditor editor;
			Rectangle dialogSize = new Rectangle(0,0,640,480);
			PagesView imageView;
			Pages pages;
			
			public class SliderPanel extends Composite{
				Scale sc;
				Label percent;
				public SliderPanel(Composite parent, int style) {
					super (parent, style);
					GridLayout gl = new GridLayout();
					gl.numColumns = 1;
					this.setLayout(gl);
					percent = new Label(this,SWT.CENTER);
					percent.setText(String.valueOf((int)(PageFormat.printScale*100))+ JSFUIMessages.OF_NORMAL_SIZE);
					GridData gd = new GridData();
					gd.horizontalAlignment = GridData.CENTER;
					percent.setLayoutData(gd);
					gd = new GridData();
					gd.horizontalAlignment = GridData.CENTER;
					sc = new Scale(this,SWT.HORIZONTAL);
					sc.setMinimum(30);
					sc.setMaximum(300);
					sc.setIncrement(10);
					sc.setSelection((int)(pages.getScale()*100));
					sc.setLayoutData(gd);
					sc.addSelectionListener(new SelectionListener(){
						public void widgetSelected(SelectionEvent e){
							percent.setText(String.valueOf(sc.getSelection())+JSFUIMessages.OF_NORMAL_SIZE);
							percent.redraw();
							pages.setScale((double)sc.getSelection()/100);
							PageFormat.printScale = (double)sc.getSelection()/100;
						}
						public void widgetDefaultSelected(SelectionEvent e){
						}
					});
				}
			}
			
			public class ControlPanel extends Composite implements PaintListener{
				Button all;
				SliderPanel sp;
				Button selectPage;
				Button selectAll;
				Button unselectAll;
				SelectionListener allListener;
				SelectionListener selectListener;
				SelectionListener selectAllListener;
				SelectionListener unSelectAllListener;
				  
				public ControlPanel(Composite parent, int style) {
					super (parent, style);
					GridLayout gl = new GridLayout();
					gl.numColumns = 2;
					gl.verticalSpacing = -12;
					this.setLayout(gl);
					GridData data = new GridData();
					data.grabExcessHorizontalSpace=true;
					data.horizontalAlignment = GridData.BEGINNING;
					data.horizontalIndent = 8;
					Label print = new Label(this,SWT.NONE);
					print.setText(JSFUIMessages.PRINT);
					print.setLayoutData(data);
					data = new GridData();
					data.horizontalAlignment = GridData.BEGINNING;
					data.horizontalIndent = 8;
					Label zoom = new Label(this,SWT.NONE);
					zoom.setText(JSFUIMessages.ZOOM);
					zoom.setLayoutData(data);
					Group gr1 = new Group(this,SWT.SHADOW_ETCHED_IN);
					gl = new GridLayout();
					gl.numColumns = 2;
					gr1.setLayout(gl);
					data = new GridData();
					data.grabExcessHorizontalSpace=true;
					data.horizontalAlignment = GridData.FILL;
					gr1.setLayoutData(data);
					data = new GridData();
					data.horizontalSpan = 2;
					data.horizontalAlignment = GridData.FILL;
					all = new Button(gr1,SWT.RADIO);
					all.setText(JSFUIMessages.ZOOM);
					all.setSelection(true);
					all.setLayoutData(data);
					selectPage = new Button(gr1,SWT.RADIO);
					selectPage.setText(JSFUIMessages.SELECTED_PAGES);
					data = new GridData();
					data.horizontalSpan = 2;
					data.horizontalAlignment = GridData.FILL;
					selectPage.setLayoutData(data);
					selectAll = new Button(gr1,SWT.PUSH);
					selectAll.setText(JSFUIMessages.SELECT_ALL);
					selectAll.setEnabled(false);
					unselectAll = new Button(gr1,SWT.PUSH);
					unselectAll.setText(JSFUIMessages.UNSELECT_ALL);
					unselectAll.setEnabled(false);
					Group gr2 = new Group(this,SWT.SHADOW_ETCHED_IN);
					gl = new GridLayout();
					gl.numColumns = 1;
					gl.marginHeight = 3;
					gl.verticalSpacing = 2;
					gr2.setLayout(gl);
					data = new GridData();
					data.horizontalAlignment = GridData.END;
					gr2.setLayoutData(data);
					sp = new SliderPanel(gr2,SWT.NONE);
					data = new GridData();
					data.horizontalAlignment = GridData.END;
					sp.setLayoutData(data);
					allListener = new SelectionListener(){
						public void widgetSelected(SelectionEvent e){
							pages.selectAll();
							selectAll.setEnabled(false);
							unselectAll.setEnabled(false);
							imageView.setSelectionEnabled(false);
						}
						public void widgetDefaultSelected(SelectionEvent e){}
					};
					all.addSelectionListener(allListener);
					selectListener =  new SelectionListener(){
						public void widgetSelected(SelectionEvent e){
							imageView.setSelectionEnabled(true);
							pages.unSelectAll();
							imageView.redraw();
						}
						public void widgetDefaultSelected(SelectionEvent e){}
						};
					selectPage.addSelectionListener(selectListener);
					PropertyChangeListener pcl = new PropertyChangeListener(){
						public void propertyChange(PropertyChangeEvent e){
						   if(e.getPropertyName().equals("selectAll")){ //$NON-NLS-1$
							  if(!all.getSelection()){
								 selectAll.setEnabled(false);
								 unselectAll.setEnabled(true);
								 imageView.redraw();
							  }
						   }
						   if(e.getPropertyName().equals("unSelectAll")){ //$NON-NLS-1$
							  if(!all.getSelection()){
								 unselectAll.setEnabled(false);
								 selectAll.setEnabled(true);
								 imageView.redraw();
							 }
						   }
						   if(e.getPropertyName().equals("PageSelection")){ //$NON-NLS-1$
							  if(!all.getSelection()){
								 unselectAll.setEnabled(true);
								selectAll.setEnabled(true);
							  }
						   }
						}
					};
					pages.addPropertyChangeListener(pcl);
					selectAllListener =  new SelectionListener(){
						public void widgetSelected(SelectionEvent e){
					   		pages.selectAll();
					    }
				   		public void widgetDefaultSelected(SelectionEvent e){}
					};
					selectAll.addSelectionListener(selectAllListener);
					
					unSelectAllListener =  new SelectionListener(){
						public void widgetSelected(SelectionEvent e){
							pages.unSelectAll();
						}
						public void widgetDefaultSelected(SelectionEvent e){}
					};
					unselectAll.addSelectionListener(unSelectAllListener);
							
				}
				
				
				public void paintControl(PaintEvent pevent){
					GC gc = pevent.gc;
					gc.setForeground(new Color(ControlPanel.this.getDisplay(),0x00,0x00,0x00));
					gc.drawLine(pevent.x,pevent.y,pevent.width,pevent.x);
					gc.drawLine(pevent.x,pevent.y,pevent.x,pevent.height);
					gc.drawLine(pevent.x,pevent.y+pevent.height-2,pevent.x+pevent.width,pevent.y+pevent.height-2);
					gc.drawLine(pevent.x+pevent.width-2,pevent.y+pevent.height,pevent.x+pevent.width-2,pevent.y);
					gc.setForeground(new Color(ControlPanel.this.getDisplay(),0xff,0xff,0xff));
					gc.drawLine(pevent.x+1,pevent.y+1,pevent.width-1,pevent.x+1);
					gc.drawLine(pevent.x+1,pevent.y+1,pevent.x+1,pevent.height-1);
					gc.dispose();
				}
				
			}
			
			public PrintPreviewDialog (Shell parent, int style) {
				super (parent, style);
				display = parent.getDisplay();
				
			}
			public PrintPreviewDialog (Shell parent) {
				this (parent, SWT.APPLICATION_MODAL);
			}
			public String getMessage () {
				return message;
			}
			public void setMessage (String string) {
				message = string;
			}
			public String open () {
				dialog = new Shell(getParent(), getStyle());
				dialog.setText(JSFUIMessages.PRINT_PREVIEW);
				GridLayout rl = new GridLayout();
				dialog.setLayout(rl);
				ControlPanel controlPanel = new ControlPanel(dialog,SWT.RESIZE);
				GridData rd = new GridData();
				rd.widthHint = 550;
				rd.heightHint = 105;
				controlPanel.setLayoutData(rd);
				imageView = new PagesView(pages,new Dimension(550,370),dialog,SWT.RESIZE);
				imageView.setBackground(new Color(dialog.getDisplay(),0xff,0xff,0xff));
				GridData rd1 = new GridData();
				rd1.widthHint = 550;
				rd1.heightHint = 400;
				imageView.setLayoutData(rd1);
				Composite buttons = new Composite(dialog, SWT.END|SWT.RESIZE);
				GridLayout grid = new GridLayout();
				grid.numColumns = 2;
				buttons.setLayout(grid);
				GridData data2 = new GridData(GridData.HORIZONTAL_ALIGN_END);
				buttons.setLayoutData(data2);
				GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
				Button ok = new Button(buttons, SWT.PUSH&SWT.MULTI);
				ok.setText(JSFUIMessages.PRINT);
				data = new GridData();
				data.widthHint = 75;
				ok.setLayoutData(data);
				ok.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent e) {
						result = "ok";
						if(editor.isBordersPaint()){
						  PrintPreviewDialog.this.pages.unSelectAll();
						  PrintPreviewDialog.this.pages.getSourcePage(0).setSelected(true);
						}
						dialog.dispose();
					}
				});
				Button cancel = new Button(buttons, SWT.PUSH);
				cancel.setText(JSFUIMessages.CLOSE);
				data = new GridData(GridData.HORIZONTAL_ALIGN_END);
				data.widthHint = 75;
				cancel.setLayoutData(data);
				cancel.addSelectionListener(new SelectionAdapter() {
					public void widgetSelected(SelectionEvent e) {
						result="cancel";
						dialog.dispose();
					}
				});
				dialog.setDefaultButton(ok);
				dialog.pack();
				dialog.open();
				while (!dialog.isDisposed()) {
					if (!display.readAndDispatch()) display.sleep();
				}
				return result;
			}
			
			public void setPrintViewer(GraphicalViewer viewer){
				this.viewer = viewer;
			}

			public void setEditor(JSFEditor editor){
				this.editor = editor;
			}
			
			public GraphicalViewer getPrintViewer(){
				return this.viewer;
			}
			
			public void setPages(Pages pages){
					this.pages = pages;
			}
			
			public Pages getPages(){
					return this.pages;
			}
		
}
