/* managementWidget.h
**
** Copyright (C) 1999,2000 Toivo Pedaste <toivo@ucs.uwa.edu.au>
**
// Author: Damyan Pepper
//
// 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.
*/

/*
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program in a file called COPYING; if not, write to
** the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
** MA 02111-1307, USA.
*/

/*
** Bug reports and questions can be sent to kde-devel@kde.org
*/




#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

  // mark all packages in the selected view
  void markAll(KPLVItem *item) ;

  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

  void countMarked(KPLVItem *);
  // Count marked packages that can be installed/uninstalled

  void setupMultButton();
  // Setup mult install/uninstall button appropriately


  ///////////// 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

  void checkMarked();
  // Count marked packages that can be installed/uninstalled

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


  ///////////// DATA ---------------------------------------------------------
private:

  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

  int cntInstall, cntUnInstall;
  // marked packages that can be installed/uninstalled

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



