summaryrefslogtreecommitdiffstats
path: root/src/projectmanager.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/projectmanager.h')
-rw-r--r--src/projectmanager.h345
1 files changed, 345 insertions, 0 deletions
diff --git a/src/projectmanager.h b/src/projectmanager.h
new file mode 100644
index 0000000..81620cb
--- /dev/null
+++ b/src/projectmanager.h
@@ -0,0 +1,345 @@
+/***************************************************************************
+ * Copyright (C) 2003-2005 by David Saxton *
+ * *
+ * 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. *
+ ***************************************************************************/
+
+#ifndef PROJECTMANAGER_H
+#define PROJECTMANAGER_H
+
+#include "itemselector.h"
+
+#include <kurl.h>
+#include <qguardedptr.h>
+#include <qvaluelist.h>
+
+class Document;
+class ILVItem;
+class KTechlab;
+class ProcessOptions;
+class ProjectInfo;
+class ProjectItem;
+class ProjectManager;
+class QDomDocument;
+class QDomElement;
+class QStringList;
+namespace KateMDI { class ToolView; }
+
+typedef QValueList<ProcessOptions> ProcessOptionsList;
+typedef QValueList< QGuardedPtr<ProjectItem> > ProjectItemList;
+
+
+class LinkerOptions
+{
+ public:
+ LinkerOptions();
+
+ class HexFormat
+ {
+ public:
+ enum type { inhx32, inhx8m, inhx8s, inhx16 };
+ };
+
+ HexFormat::type hexFormat() const { return m_hexFormat; }
+ void setHexFormat( HexFormat::type hexFormat ) { m_hexFormat = hexFormat; }
+
+ bool outputMapFile() const { return m_bOutputMapFile; }
+ void setOutputMapFile( bool outputMapFile ) { m_bOutputMapFile = outputMapFile; }
+
+ QString libraryDir() const { return m_libraryDir; }
+ void setLibraryDir( const QString & libraryDir ) { m_libraryDir = libraryDir; }
+
+ QString linkerScript() const { return m_linkerScript; }
+ void setLinkerScript( const QString & linkerScript ) { m_linkerScript = linkerScript; }
+
+ QString linkerOther() const { return m_other; }
+ void setLinkerOther( const QString & other ) { m_other = other; }
+
+ /**
+ * Used for linkable ProjectItems. Returns a list of urls of files
+ * inside the project to link against. Each url is relative to the
+ * project directory.
+ */
+ QStringList linkedInternal() const { return m_linkedInternal; }
+ void setLinkedInternal( const QStringList & linkedInternal ) { m_linkedInternal = linkedInternal; }
+
+ /**
+ * Used for linkable ProjectItems. Returns a list of urls of files
+ * outside the project to link against. Each url is absolute.
+ */
+ QStringList linkedExternal() const { return m_linkedExternal; }
+ void setLinkedExternal( const QStringList & linkedExternal ) { m_linkedExternal = linkedExternal; }
+
+ QDomElement toDomElement( QDomDocument & doc, const KURL & baseURL ) const;
+
+ static QString hexFormatToString( HexFormat::type format );
+ static HexFormat::type stringToHexFormat( const QString & hexFormat );
+
+ protected:
+ void domElementToLinkerOptions( const QDomElement & element, const KURL & baseURL );
+
+ QStringList m_linkedInternal;
+ QStringList m_linkedExternal;
+ HexFormat::type m_hexFormat;
+ bool m_bOutputMapFile;
+ QString m_libraryDir;
+ QString m_linkerScript;
+ QString m_other;
+};
+
+
+class ProcessingOptions
+{
+ public:
+ ProcessingOptions();
+ virtual ~ProcessingOptions();
+
+ /**
+ * Sets the output url that this item will be built into (if this is a
+ * buildable item).
+ */
+ void setOutputURL( const KURL & url ) { m_outputURL = url; }
+ KURL outputURL() const { return m_outputURL; }
+
+ /**
+ * Set the microprocessor id that this project item is being built for
+ * (when applicable).
+ */
+ virtual void setMicroID( const QString & id ) { m_microID = id; }
+ virtual QString microID() const { return m_microID; }
+
+ QDomElement toDomElement( QDomDocument & doc, const KURL & baseURL ) const;
+
+ void setUseParentMicroID( bool useParentMicroID ) { m_bUseParentMicroID = useParentMicroID; }
+ bool useParentMicroID() const { return m_bUseParentMicroID; }
+
+ protected:
+ void domElementToProcessingOptions( const QDomElement & element, const KURL & baseURL );
+
+ KURL m_outputURL;
+ QString m_microID;
+ bool m_bUseParentMicroID;
+};
+
+
+/**
+@author David Saxton
+*/
+class ProjectItem : public QObject, public LinkerOptions, public ProcessingOptions
+{
+ public:
+ enum Type
+ {
+ ProjectType = 1 << 0,
+ FileType = 1 << 1,
+ ProgramType = 1 << 2,
+ LibraryType = 1 << 3
+ };
+ enum { AllTypes = ProjectType | FileType | ProgramType | LibraryType };
+
+ enum OutputType
+ {
+ ProgramOutput = 1 << 0,
+ ObjectOutput = 1 << 1,
+ LibraryOutput = 1 << 2,
+ UnknownOutput = 1 << 3
+ };
+ enum { AllOutputs = ProgramOutput | ObjectOutput | LibraryOutput | UnknownOutput };
+
+ ProjectItem( ProjectItem * parent, Type type, ProjectManager * projectManager, KTechlab * ktechlab );
+ virtual ~ProjectItem();
+
+ Type type() const { return m_type; }
+ QString typeToString() const;
+ static Type stringToType( const QString & type );
+
+ void setILVItem( ILVItem * ilvItem );
+
+ /**
+ * Adds the child to the list of children, and creates an ILVItem for it
+ * in the project tree view.
+ */
+ void addChild( ProjectItem * child );
+ ProjectItemList children() const { return m_children; }
+
+ void setName( const QString & name );
+ QString name() const { return m_name; }
+
+ /**
+ * Sets the (input) url that this project item refers to. If the output
+ * url has not yet been set, then this project item will set the output
+ * url based on this (input) url.
+ */
+ void setURL( const KURL & url );
+ KURL url() const { return m_url; }
+
+ OutputType outputType() const;
+
+ /**
+ * Returns a list of output urls of the children and their recursively
+ * contained children (does not include the url for this project item).
+ * @param types An OR'ed list of ProjectItem::Type values for the
+ * children.
+ * @param outputTypes An OR'ed list of ProjectItem::OutputType values
+ * for the children.
+ */
+ KURL::List childOutputURLs( unsigned types = AllTypes, unsigned outputTypes = AllOutputs ) const;
+
+ /**
+ * Creates a new ProjectItem for the given url and adds it as a child.
+ */
+ void addFile( const KURL & url );
+ /**
+ * Queries the user for a list of urls to add, and then calls addFile
+ * for each url.
+ */
+ void addFiles();
+
+ void addCurrentFile();
+ bool closeOpenFiles();
+ QDomElement toDomElement( QDomDocument & doc, const KURL & baseURL ) const;
+
+ bool build( ProcessOptionsList * pol );
+ void upload( ProcessOptionsList * pol );
+
+ virtual void setMicroID( const QString & id );
+ virtual QString microID() const;
+
+ /**
+ * Searches this item and the children for an item for the given url,
+ * return null if no such item could be found.
+ */
+ ProjectItem * findItem( const KURL & url );
+
+ protected:
+ void domElementToItem( const QDomElement & element, const KURL & baseURL );
+ void updateILVItemPixmap();
+ void updateControlChildMicroIDs();
+
+ KURL m_url;
+ QString m_name;
+ ProjectItemList m_children;
+ Type m_type;
+
+ KTechlab * p_ktechlab;
+ QGuardedPtr<ILVItem> m_pILVItem;
+ ProjectManager * m_pProjectManager;
+ ProjectItem * m_pParent;
+};
+
+
+/**
+@author David Saxton
+*/
+class ProjectInfo : public ProjectItem
+{
+ Q_OBJECT
+
+ public:
+ ProjectInfo( ProjectManager * projectManager, KTechlab * ktechlab );
+ ~ProjectInfo();
+
+ /**
+ * Returns the directory that the project is saved in
+ */
+ QString directory() const { return m_url.directory(false); }
+
+ /**
+ * Saves the project information to file, and attempts to close all
+ * open project files.
+ * @return true iff succesful
+ */
+ bool saveAndClose();
+ bool save();
+
+ bool open( const KURL & url );
+};
+
+/**
+@short Project Management
+@author David Saxton
+*/
+class ProjectManager : public ItemSelector
+{
+ Q_OBJECT
+ public:
+ ~ProjectManager();
+ static ProjectManager * self( KTechlab * ktl = 0l, KateMDI::ToolView * parent = 0l );
+
+ static QString toolViewIdentifier() { return "ProjectManager"; }
+
+ /**
+ * @return the currently open project, or NULL if no project is open.
+ */
+ ProjectInfo * currentProject() const { return m_pCurrentProject; }
+
+ void updateActions();
+
+ signals:
+ /**
+ * Emitted when an existing project is opened.
+ */
+ void projectOpened();
+ /**
+ * Emitted when the current project is closed.
+ */
+ void projectClosed();
+ /**
+ * Emitted when a new project is created.
+ */
+ void projectCreated();
+ /**
+ * Emitted when a subproject is created.
+ */
+ void subprojectCreated();
+ /**
+ * Emitted when file(s) are added to the project or a subproject.
+ */
+ void filesAdded();
+ /**
+ * Emitted when file(s) are removed from the project or a subproject.
+ */
+ void filesRemoved();
+
+ public slots:
+ void slotNewProject();
+ void slotOpenProject();
+ void slotOpenProject( const KURL &url );
+ bool slotCloseProject();
+ void slotCreateSubproject();
+ void slotAddFile();
+ void slotAddCurrentFile();
+ void slotSubprojectAddExistingFile();
+ void slotSubprojectAddCurrentFile();
+ void slotItemBuild();
+ void slotItemUpload();
+ void slotItemProcessingOptions();
+ void slotRemoveSelected();
+ void slotExportToMakefile();
+ void slotSubprojectLinkerOptions();
+ /**
+ * Pops ups a project configuration dialog
+ */
+ void slotProjectOptions();
+
+ private slots:
+ void slotContextMenuRequested( QListViewItem *item, const QPoint &pos, int col );
+ /**
+ * Called when a user clicks on any item in the project view
+ */
+ void slotItemClicked( QListViewItem * item );
+
+ protected:
+ ProjectInfo * m_pCurrentProject;
+ KTechlab * const p_ktechlab;
+
+ private:
+ ProjectManager( KTechlab * ktl, KateMDI::ToolView * parent );
+ static ProjectManager * m_pSelf;
+};
+
+#endif