import java.util.*;

import org.kde.qt.*;
import org.kde.koala.*;

/**
  * The base class for JavaApiTest application windows. It sets up the main
  * window and reads the config file as well as providing a menubar, toolbar
  * and statusbar. An instance of KBaseView creates your center view, which is connected
  * to the window's Doc object.
  * KBase reimplements the methods that KMainWindow provides for main window handling and supports
  * full session management as well as using KActions.
  * @see KMainWindow
  * @see KApplication
  * @see KConfig
  *
  * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
  * @version KDevelop version 1.2 code generation
  */
public class KBase extends KMainWindow
{
    public static final int ID_STATUS_MSG = 1;

	/** the configuration object of the application */
    private KConfig config;
    /** view is the main widget which represents your working area. The View
     * class should handle all events of the view widget.  It is kept empty so
     * you can create your view according to your application's needs by
     * changing the view class.
     */
    private KBaseView view;
    /** doc represents your actual document and is created only once. It keeps
     * information such as filename and does the serialization of your files.
     */
    private KBaseDoc doc;

    // KAction references to enable/disable actions
    private KAction fileNewWindow;
    private KAction fileNew;
    private KAction fileOpen;
    private KRecentFilesAction fileOpenRecent;
    private KAction fileSave;
    private KAction fileSaveAs;
    private KAction fileClose;
    private KAction filePrint;
    private KAction fileQuit;
    private KAction editCut;
    private KAction editCopy;
    private KAction editPaste;
    private KToggleAction viewToolBar;
    private KToggleAction viewStatusBar;

    /** construtor of KBase, calls all init functions to create the application.
     */
public KBase(QWidget parent, String name)
{
  super(parent, name, 0);
  KApplication kapp = KApplication.kApplication();
  config=kapp.config();

  ///////////////////////////////////////////////////////////////////
  // call inits to invoke all other construction parts
  initStatusBar();
  initActions();
  initDocument();
  initView();
	
  readOptions();

  ///////////////////////////////////////////////////////////////////
  // disable actions at startup
  fileSave.setEnabled(false);
  fileSaveAs.setEnabled(false);
  filePrint.setEnabled(false);
  editCut.setEnabled(false);
  editCopy.setEnabled(false);
 }

public KBase()
{
	this(null, null);
}

    /** initializes the KActions of the application */
protected void initActions()
{
  fileNewWindow = new KAction(tr("New &Window"), "", new KShortcut(), this, SLOT("slotFileNewWindow()"), actionCollection(),"file_new_window");
  fileNew = KStdAction.openNew(this, SLOT("slotFileNew()"), actionCollection());
  fileOpen = KStdAction.open(this, SLOT("slotFileOpen()"), actionCollection());
  fileOpenRecent = (KRecentFilesAction) KStdAction.openRecent(this, SLOT("slotFileOpenRecent(KURL)"), actionCollection());
  fileSave = KStdAction.save(this, SLOT("slotFileSave()"), actionCollection());
  fileSaveAs = KStdAction.saveAs(this, SLOT("slotFileSaveAs()"), actionCollection());
  // this one crashes for me...
//  fileClose = KStdAction.close(this, SLOT(slotFileClose()), actionCollection());
  filePrint = KStdAction.print(this, SLOT("slotFilePrint()"), actionCollection());
  fileQuit = KStdAction.quit(this, SLOT("slotFileQuit()"), actionCollection());
  editCut = KStdAction.cut(this, SLOT("slotEditCut()"), actionCollection());
  editCopy = KStdAction.copy(this, SLOT("slotEditCopy()"), actionCollection());
  editPaste = KStdAction.paste(this, SLOT("slotEditPaste()"), actionCollection());
  createStandardStatusBarAction();
//  viewToolBar = KStdAction.showToolbar(this, SLOT("slotViewToolBar()"), actionCollection());
  viewStatusBar = KStdAction.showStatusbar(this, SLOT("slotViewStatusBar()"), actionCollection());

  fileNewWindow.setToolTip(tr("Opens a new application window"));
  fileNew.setToolTip(tr("Creates a new document"));
  fileOpen.setToolTip(tr("Opens an existing document"));
  fileOpenRecent.setToolTip(tr("Opens a recently used file"));
  fileSave.setToolTip(tr("Saves the actual document"));
  fileSaveAs.setToolTip(tr("Saves the actual document as..."));
//  fileClose.setToolTip(tr("Closes the actual document"));
  filePrint .setToolTip(tr("Prints out the actual document"));
  fileQuit.setToolTip(tr("Quits the application"));
  editCut.setToolTip(tr("Cuts the selected section and puts it to the clipboard"));
  editCopy.setToolTip(tr("Copies the selected section to the clipboard"));
  editPaste.setToolTip(tr("Pastes the clipboard contents to actual position"));
//  viewToolBar.setToolTip(tr("Enables/disables the toolbar"));
  viewStatusBar.setToolTip(tr("Enables/disables the statusbar"));

  // use the absolute path to your kbaseui.rc file for testing purpose in createGUI();
  createGUI();

}



    /** sets up the kstatusBar for the main window by initialzing a statuslabel.
     */
protected void initStatusBar()
{
  ///////////////////////////////////////////////////////////////////
  // STATUSBAR
  // TODO: add your own items you need for displaying current application status.
  kstatusBar().insertItem(tr("Ready."), ID_STATUS_MSG);
}

    /** initializes the document object of the main window that is connected to the view in initView().
     * @see initView();
     */
public void initDocument()
{
  doc = new KBaseDoc(this, null);
  doc.newDocument();
}

    /** creates the centerwidget of the KTMainWindow instance and sets it as the view
     */
protected void initView()
{
  ////////////////////////////////////////////////////////////////////
  // create the main widget here that is managed by KTMainWindow's view-region and
  // connect the widget to your document to display document contents.

  view = new KBaseView(this, null);
  doc.addView(view);
  setCentralWidget(view);	
  setCaption(doc.URL().fileName(),false);

}

    /** opens a file specified by commandline option
     */
public void openDocumentFile(KURL url)
{
  slotStatusMsg(tr("Opening file..."));

//   doc.openDocument( url);
   fileOpenRecent.addURL( url );
  slotStatusMsg(tr("Ready."));
}

public void openDocumentFile()
{
	openDocumentFile(new KURL(""));
	return;
}


    /** returns a pointer to the current document connected to the KTMainWindow instance and is used by
     * the View class to access the document object's methods
     */
public KBaseDoc getDocument()
{
  return doc;
}

    /** save general Options like all bar positions and status as well as the geometry and the recent file list to the configuration
     * file
     */
protected void saveOptions()
{
  config.setGroup("General Options");
  config.writeEntry("Geometry", size());
//  config.writeEntry("Show Toolbar", viewToolBar.isChecked());
  config.writeEntry("Show Statusbar",viewStatusBar.isChecked());
//  config.writeEntry("ToolBarPos", (int) toolBar("mainToolBar").barPos());
  fileOpenRecent.saveEntries(config,"Recent Files");
}


    /** read general Options again and initialize all variables like the recent file list
     */
protected void readOptions()
{
	
  config.setGroup("General Options");

  // bar status settings
//  boolean bViewToolbar = config.readBoolEntry("Show Toolbar", true);
//  viewToolBar.setChecked(bViewToolbar);
//  slotViewToolBar();

  boolean bViewStatusbar = config.readBoolEntry("Show Statusbar", true);
  viewStatusBar.setChecked(bViewStatusbar);
  slotViewStatusBar();


  // bar position settings
//  int toolBarPos;
  //Pos=(int) config.readNumEntry("ToolBarPos", KToolBar.Top);
//  toolBar("mainToolBar").setBarPos(toolBarPos);
	
  // initialize the recent file list
  fileOpenRecent.loadEntries(config,"Recent Files");

  QSize size=config.readSizeEntry("Geometry", null);
  if(!size.isEmpty())
  {
    resize(size);
  }
}

    /** saves the window properties for each open window during session end to the session config file, including saving the currently
     * opened file by a temporary filename provided by KApplication.
     * @see KTMainWindow#saveProperties
     */
protected void saveProperties(KConfig _cfg)
{
  if(doc.URL().fileName()!=tr("Untitled") && !doc.isModified())
  {
    // saving to tempfile not necessary

  }
  else
  {
    KURL url=doc.URL();	
    _cfg.writeEntry("filename", url.url());
    _cfg.writeEntry("modified", doc.isModified());
    String tempname = KApplication.kApplication().tempSaveName(url.url());
    String tempurl= KURL.encode_string(tempname, 0);
    KURL _url = new KURL(tempurl);
    doc.saveDocument(_url);
  }
}


    /** reads the session config file and restores the application's state including the last opened files and documents by reading the
     * temporary files saved by saveProperties()
     * @see KTMainWindow#readProperties
     */
protected void readProperties(KConfig _cfg)
{
  String filename = _cfg.readEntry("filename", "");
  KURL url = new KURL(filename);
  boolean modified = _cfg.readBoolEntry("modified", false);
  if(modified)
  {
    boolean canRecover = false;
    String tempname = KApplication.kApplication().checkRecoverFile(filename, canRecover);
    KURL _url = new KURL(tempname);
  	
    if(canRecover)
    {
      doc.openDocument(_url);
      doc.setModified();
      setCaption(_url.fileName(),true);
      QFile.remove(tempname);
    }
  }
  else
  {
    if(filename.length() > 0)
    {
      doc.openDocument(url);
      setCaption(url.fileName(),false);
    }
  }
}		

    /** queryClose is called by KTMainWindow on each closeEvent of a window. Against the
     * default implementation (only returns true), this calles saveModified() on the document object to ask if the document shall
     * be saved if Modified; on cancel the closeEvent is rejected.
     * @see KTMainWindow#queryClose
     * @see KTMainWindow#closeEvent
     */
protected boolean queryClose()
{
  return doc.saveModified();
}

    /** queryExit is called by KTMainWindow when the last window of the application is going to be closed during the closeEvent().
     * Against the default implementation that just returns true, this calls saveOptions() to save the settings of the last window's
     * properties.
     * @see KTMainWindow#queryExit
     * @see KTMainWindow#closeEvent
     */
protected boolean queryExit()
{
  saveOptions();
  return true;
}

/////////////////////////////////////////////////////////////////////
// SLOT IMPLEMENTATION
/////////////////////////////////////////////////////////////////////

    /** open a new application window by creating a new instance of KBase */
public void slotFileNewWindow()
{
  slotStatusMsg(tr("Opening a new application window..."));
	
  KBase new_window= new KBase();
  new_window.show();

  slotStatusMsg(tr("Ready."));
}

    /** clears the document in the actual view to reuse it as the new document */
public void slotFileNew()
{
  slotStatusMsg(tr("Creating new document..."));

  if(!doc.saveModified())
  {
     // here saving wasn't successful

  }
  else
  {	
    doc.newDocument();		
    setCaption(doc.URL().fileName(), false);
  }

  slotStatusMsg(tr("Ready."));
}

    /** open a file and load it into the document*/
public void slotFileOpen()
{
System.out.println("ENTER slotFileOpen()");
  slotStatusMsg(tr("Opening file..."));
	
  if(!doc.saveModified())
  {
     // here saving wasn't successful

  }
  else
  {	
    KURL url=KFileDialog.getOpenURL("",
        tr("*|All files"), this, tr("Open File..."));
    if(!url.isEmpty())
    {
      doc.openDocument(url);
      setCaption(url.fileName(), false);
      fileOpenRecent.addURL( url );
    }
  }
  slotStatusMsg(tr("Ready."));
}

    /** opens a file from the recent files menu */
public void slotFileOpenRecent(KURL url)
{
  slotStatusMsg(tr("Opening file..."));
	
  if(!doc.saveModified())
  {
     // here saving wasn't successful
  }
  else
  {
    doc.openDocument(url);
    setCaption(url.fileName(), false);
  }

  slotStatusMsg(tr("Ready."));
}

    /** save a document */
public void slotFileSave()
{
  slotStatusMsg(tr("Saving file..."));
	
  doc.saveDocument(doc.URL());

  slotStatusMsg(tr("Ready."));
}

   /** save a document by a new filename*/
public void slotFileSaveAs()
{
  slotStatusMsg(tr("Saving file with a new filename..."));

  KURL url=KFileDialog.getSaveURL(QDir.currentDirPath(),
        tr("*|All files"), this, tr("Save as..."));
  if(!url.isEmpty())
  {
    doc.saveDocument(url);
    fileOpenRecent.addURL(url);
    setCaption(url.fileName(),doc.isModified());
  }

  slotStatusMsg(tr("Ready."));
}

    /** asks for saving if the file is modified, then closes the actual file and window*/
public void slotFileClose()
{
  slotStatusMsg(tr("Closing file..."));
	
  close();

  slotStatusMsg(tr("Ready."));
}

    /** print the actual file */
public void slotFilePrint()
{
  slotStatusMsg(tr("Printing..."));

  QPrinter printer = new QPrinter();
  if (printer.setup(this))
  {
    view.print(printer);
  }

  slotStatusMsg(tr("Ready."));
}

    /** closes all open windows by calling close() on each memberList item until the list is empty, then quits the application.
     * If queryClose() returns false because the user canceled the saveModified() dialog, the closing breaks.
     */
public void slotFileQuit()
{
  slotStatusMsg(tr("Exiting..."));
  saveOptions();
  // close the first window, the list makes the next one the first again.
  // This ensures that queryClose() is called on each window to ask for closing
  KMainWindow w;
  Iterator it = memberList().iterator();
  while(it.hasNext())
  {
    w=(KMainWindow)it.next();
    // only close the window if the closeEvent is accepted. If the user presses Cancel on the saveModified() dialog,
    // the window and the application stay open.
    if(!w.close())
	  break;
  }

  slotStatusMsg(tr("Ready."));
}

    /** put the marked text/object into the clipboard and remove
     *	it from the document
     */
public void slotEditCut()
{
  slotStatusMsg(tr("Cutting selection..."));

  slotStatusMsg(tr("Ready."));
}

    /** put the marked text/object into the clipboard
     */
public void slotEditCopy()
{
  slotStatusMsg(tr("Copying selection to clipboard..."));

  slotStatusMsg(tr("Ready."));
}

    /** paste the clipboard into the document
     */
public void slotEditPaste()
{
  slotStatusMsg(tr("Inserting clipboard contents..."));

  slotStatusMsg(tr("Ready."));
}

    /** toggles the toolbar
     */
public void slotViewToolBar()
{
  slotStatusMsg(tr("Toggling toolbar..."));
  ///////////////////////////////////////////////////////////////////
  // turn Toolbar on or off
//  if(!viewToolBar.isChecked())
//  {
//    toolBar("mainToolBar").hide();
//  }
//  else
//  {
//    toolBar("mainToolBar").show();
//  }		

  slotStatusMsg(tr("Ready."));
}

    /** toggles the statusbar
     */
public void slotViewStatusBar()
{
  slotStatusMsg(tr("Toggle the statusbar..."));
  ///////////////////////////////////////////////////////////////////
  //turn Statusbar on or off
  if(!viewStatusBar.isChecked())
  {
    kstatusBar().hide();
  }
  else
  {
    kstatusBar().show();
  }

  slotStatusMsg(tr("Ready."));
}


    /** changes the statusbar contents for the standard label permanently, used to indicate current actions.
     * @param text the text that is displayed in the statusbar
     */
public void slotStatusMsg(String text)
{
  ///////////////////////////////////////////////////////////////////
  // change status message permanently
  kstatusBar().clear();
  kstatusBar().changeItem(text, ID_STATUS_MSG);
}

static String description =
	"JavaApiTest";
// INSERT A DESCRIPTION FOR YOUR APPLICATION HERE


static String[][] options =
{
  { "+[File]", "file to open", null }
  // INSERT YOUR COMMANDLINE OPTIONS HERE
};

static String VERSION = "0.1";

public static void main(String[] cmdLineArgs)
{

	KAboutData aboutData = new KAboutData( "kbase", "JavaApiTest",
		VERSION, description, KAboutData.License_GPL,
		"(c) 2001, Richard Dale");
	aboutData.addAuthor("Richard Dale",null, "Lost_Highway@tipitina.demon.co.uk");
	KCmdLineArgs.init( cmdLineArgs, aboutData );
	KCmdLineArgs.addCmdLineOptions( options ); // Add our own options.

  KApplication app = new KApplication();

  if (app.isRestored())
  {
    RESTORE("KBase");
  }
  else
  {
    KBase kbase = new KBase();
    kbase.show();
    KCmdLineArgs args = KCmdLineArgs.parsedArgs();

		if (args.count() > 0)
		{
        kbase.openDocumentFile(new KURL(args.arg(0)));
		}
		else
		{
		  kbase.openDocumentFile();
		}
		args.clear();
  }

  app.exec();
  return;
}

	static {
                qtjava.initialize();
                kdejava.initialize();
	}

}
