import java.util.*;

import org.trinitydesktop.qt.*;
import org.trinitydesktop.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 TDEMainWindow provides for main window handling and supports
  * full session management as well as using TDEActions.
  * @see TDEMainWindow
  * @see TDEApplication
  * @see TDEConfig
  *
  * @author Source Framework Automatically Generated by KDevelop, (c) The KDevelop Team.
  * @version KDevelop version 1.2 code generation
  */
public class KBase extends TDEMainWindow
{
    public static final int ID_STATUS_MSG = 1;

	/** the configuration object of the application */
    private TDEConfig 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;

    // TDEAction references to enable/disable actions
    private TDEAction fileNewWindow;
    private TDEAction fileNew;
    private TDEAction fileOpen;
    private TDERecentFilesAction fileOpenRecent;
    private TDEAction fileSave;
    private TDEAction fileSaveAs;
    private TDEAction fileClose;
    private TDEAction filePrint;
    private TDEAction fileQuit;
    private TDEAction editCut;
    private TDEAction editCopy;
    private TDEAction editPaste;
    private TDEToggleAction viewToolBar;
    private TDEToggleAction viewStatusBar;

    /** construtor of KBase, calls all init functions to create the application.
     */
public KBase(TQWidget parent, String name)
{
  super(parent, name, 0);
  TDEApplication kapp = TDEApplication.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 TDEActions of the application */
protected void initActions()
{
  fileNewWindow = new TDEAction(tr("New &Window"), "", new TDEShortcut(), this, TQ_SLOT("slotFileNewWindow()"), actionCollection(),"file_new_window");
  fileNew = KStdAction.openNew(this, TQ_SLOT("slotFileNew()"), actionCollection());
  fileOpen = KStdAction.open(this, TQ_SLOT("slotFileOpen()"), actionCollection());
  fileOpenRecent = (TDERecentFilesAction) KStdAction.openRecent(this, TQ_SLOT("slotFileOpenRecent(KURL)"), actionCollection());
  fileSave = KStdAction.save(this, TQ_SLOT("slotFileSave()"), actionCollection());
  fileSaveAs = KStdAction.saveAs(this, TQ_SLOT("slotFileSaveAs()"), actionCollection());
  // this one crashes for me...
//  fileClose = KStdAction.close(this, TQ_SLOT(slotFileClose()), actionCollection());
  filePrint = KStdAction.print(this, TQ_SLOT("slotFilePrint()"), actionCollection());
  fileQuit = KStdAction.quit(this, TQ_SLOT("slotFileQuit()"), actionCollection());
  editCut = KStdAction.cut(this, TQ_SLOT("slotEditCut()"), actionCollection());
  editCopy = KStdAction.copy(this, TQ_SLOT("slotEditCopy()"), actionCollection());
  editPaste = KStdAction.paste(this, TQ_SLOT("slotEditPaste()"), actionCollection());
  createStandardStatusBarAction();
//  viewToolBar = KStdAction.showToolbar(this, TQ_SLOT("slotViewToolBar()"), actionCollection());
  viewStatusBar = KStdAction.showStatusbar(this, TQ_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", TDEToolBar.Top);
//  toolBar("mainToolBar").setBarPos(toolBarPos);

  // initialize the recent file list
  fileOpenRecent.loadEntries(config,"Recent Files");

  TQSize 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 TDEApplication.
     * @see KTMainWindow#saveProperties
     */
protected void saveProperties(TDEConfig _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 = TDEApplication.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(TDEConfig _cfg)
{
  String filename = _cfg.readEntry("filename", "");
  KURL url = new KURL(filename);
  boolean modified = _cfg.readBoolEntry("modified", false);
  if(modified)
  {
    boolean canRecover = false;
    String tempname = TDEApplication.kApplication().checkRecoverFile(filename, canRecover);
    KURL _url = new KURL(tempname);

    if(canRecover)
    {
      doc.openDocument(_url);
      doc.setModified();
      setCaption(_url.fileName(),true);
      TQFile.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(TQDir.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..."));

  TQPrinter printer = new TQPrinter();
  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
  TDEMainWindow w;
  Iterator it = memberList().iterator();
  while(it.hasNext())
  {
    w=(TDEMainWindow)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)
{

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

  TDEApplication app = new TDEApplication();

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

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

  app.exec();
  return;
}

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

}
