/////////////////////////////////////////////////////////////////////////
// $Id: managementWidget.h,v 1.23.2.1 2003/03/13 00:05:21 rnolden Exp $	
// File  : managementWidget.h
// Author: Damyan Pepper
// Author: Toivo Pedaste
//
// This widget is used to provide the management mode of ksetup.
// There are two subwidgets; firstly a tree list showing all the
// currently installed packages and secondly a display of the currently
// selected package's properties.
//
// There are also some control buttons which allow the currently
// selected package to be uninstalled or verified.
///////////////////////////////////////////////////////////////////////

#ifndef MANAGEMENTWIDGET_H
#define MANAGEMENTWIDGET_H

#include "../config.h"
// Standard Headers

// Qt Headers
#include <qframe.h>
#include <qpushbutton.h>
#include <qptrlist.h>
#include <qstring.h>
#include <qlayout.h>
#include <qtabwidget.h> 


// KDE headers
#include <kaction.h>
#include <klistview.h>

// ksetup headers
#include "packageInfo.h"
#include "kplview.h"

class packageDisplayWidget;
class packageInfo;
class QSplitter;

class managementWidget : public QFrame
{
  Q_OBJECT

  ///////////// METHODS ------------------------------------------------------
public:
  managementWidget(QWidget *parent=0);
  // Constructor

  ~managementWidget();
  // Destructor

  KPLVItem *search(QString str, QString head,
			KPLVItem  *start = 0);
  KPLVItem *search(QString str, bool subStr, bool wrap, bool start);
  // search for a package in tree

  KPLVItem *changePack(KPLVItem *searchResult, bool push = true);
  // Change to other package

  KPLVItem *updatePackage(packageInfo *pki, bool install);
  // update package in treelist

  void readPSeparator();
  void writePSeparator();
  // config: position of panel seperator

  void readTreeType();
  void writeTreeType();
  // config: Tree display type

  void expandTree(KPQListView *list);
  // expand package tree

  void expandTree(KPLVItem *item);
  // expand package sub-tree

  void collapseTree(KPQListView *list);
  // semi-collapse package tree

  void collapseTree(KPLVItem *item);
  // semi-collapse package sub-tree

  void writeTreePos();
  void readTreePos();
  // save and restore column positions

  void findMarked(KPLVItem *item);
  // generate list of marked tree items
  void clearMarked(KPLVItem *item);
  // unmark marked tree items

  void sweep() ;
  // sweep package tree adjusting visibility

  void doChangePackage(packageInfo *p);
  // emit change package

protected:
  void resizeEvent(QResizeEvent *re);
  // This is called when the widget is resized

private:
  void setupWidgets();
  // This sets up the sub-widgets

  void setupInstButton();
  // Set button for inst or uninst

  void arrangeWidgets();
  // This arranges the widgets in the window (should be called after a
  // resize event)

  int  sweepChild(KPLVItem *it);
  // recursive routine for sweep

  ///////////// SLOTS   ------------------------------------------------------
 public slots:
 void collectData(bool refresh);
  // This collects data about all the packages installed.
  // The list tree is filled with this data.  Whenever something happens
  // that requires data to be (re)collected a signal connected to this slot
  // should be emitted.  This function can also be called directly.

  void rebuildListTree();
  // This rebuilds the list tree.  This would normally be called if the
  // data contained about the packages has been changed (e.g. a verification
  // failed / succeeded).

  void uninstallMultClicked();
  // This is called when uninstalling multiple packages

  void uninstallSingleClicked();
  // This is called when uninstalling a single package

  void installSingleClicked();
  // This is called when the install button has been clicked with single package

  void installMultClicked();
  // This is called when the install button has been clicked with multiple packages

  void stackRemove(KPLVItem *pack);
  // Remove entry from package stack

  void next();
  // Package stack forward

  void previous();
  // Package stack back

  void setInstallAction(KAction *a) { install_action = a; }
  void setUninstallAction(KAction *a) { uninstall_action = a; }

 void packageHighlighted(QListViewItem *);
  // This is called when a package has been highlighted in the list tree

  void tabChanged(int);
  // treelist display tab changed

 ///////////// SIGNALS ------------------------------------------------------

  signals:
  void changePackage(packageInfo *p);

  ///////////// DATA ---------------------------------------------------------
private:
  packageInfo *package;

  QPushButton *linstButton,*luinstButton,*instButton,*uinstButton;
  // This button is used to (un)install the selected package

  packageDisplayWidget *packageDisplay;
  // This widget displays the package info / file-list

  QBoxLayout *top, *leftbox, *rightbox, *lbuttons, *rbuttons;
  // These are the geometry managers

  QFrame *leftpanel, *rightpanel;
  // frame to put QBox in

  QTabWidget *ltab;
  // tab between various treelist displays

  QSplitter *vPan;
  // veritcal panner between panels

  bool searchChild(KPLVItem *it);
  // recurse thru the display tree looking for 'str'

  KPLVItem *searchCitem;
  bool searchSkip, searchSubstr;
  QString searchStr;
  KPLVItem  *searchResult;
  // globals used by searchChild for start from current position,
  // skip to current item before search flag, substring search flag, 
  // search string, result item (if found)

  // flag skipping in searchChild

  QPtrList<KPLVItem> selList;
  // list for selected packages

  bool notPress;
  // flag to packageHighlighted

  QString tType[4];
  // identifiers for tree display

  int treeType;
  // type of tree display

public:
  QPtrList<packageInfo> *allPackages;
  // The list of packages

  QDict<packageInfo> *dirInstPackages;
  // maps installed package name to package

  QDict<packageInfo> *dirUninstPackages;
  // maps uninstalled package name to package

  QDict<packageInfo> *dirInfoPackages;
  // maps Info package name to package

  KPQListView *treeList;
  // This is the tree list where all the packages / groups are displayed

  QPtrList<KPLVItem> stack;
  // Stack of jumped to pacckages
  
  KAction *install_action;
  KAction *uninstall_action;
};

#endif



