/****************/ /* doclask.h */ /****************/ // Autolaskurin Doc/View -version yleiset osat // #ifndef DOCLASK_H #define DOCLASK_H #if __BORLANDC__ >= 0x460 #define OWL5 // Määrittele tämä sen mukaan kumpaa käytät #endif #include #include #include #include #include #ifdef OWL5 #include #endif #include #include "laskurm4.rh" #include "owl\intlabel.h" #include "clipboar.h" #include "mjonot.h" #define LASKUREITA 2 #define INIFILE ".\\Laskuri.ini" //------------------------------------------------------------------------------ // Dokumenttiluokka joka huolehtii pelkästään dokumentista //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ class TLaskuriDocument : public TFileDocument { //------------------------------------------------------------------------------ int laskurit[LASKUREITA]; int OK(int i) { return 0 <= i && i < LASKUREITA; } int dataOK; public: TLaskuriDocument(TDocument* parent = 0); ~TLaskuriDocument(); // implement virtual methods of TDocument bool Open(int mode, const char far* path=0); bool Close() { dataOK = 0; return true; } bool IsOpen() { return dataOK; } bool Commit(bool force = false); bool Revert(bool clear = false); void set(int index,int i) { if ( OK(index) && laskurit[index] != i ) { laskurit[index] = i; SetDirty(true); } } int GetData(int index) { // HUOM!!! Tätä on itse kutsuttava jostakin!!! if ( !dataOK && !Open(ofRead) ) return 0; if ( OK(index) ) return laskurit[index]; else return 0; } bool Refresh() { return TFileDocument::Revert(false); } friend istream &operator>>(istream &is, TLaskuriDocument &doc); friend ostream &operator<<(ostream &os, const TLaskuriDocument &doc); const char *AsText() const; int FromText(const char *s) { istrstream is((char *)s); is >> *this; return 0;} int ToClipboard(HWND hWnd) const { return TextToClipboard(hWnd,AsText()); } int FromClipboard(HWND hWnd) { return FromText(TextClipboard(hWnd)); } }; //------------------------------------------------------------------------------ class TIntLaskuri : public TIntLabel { // Laskuri, joka ilmoittaa muutoksen //------------------------------------------------------------------------------ TLaskuriDocument &doc; int index; public: TIntLaskuri(TLaskuriDocument &d,int ind,TWindow* parent, int resourceId, uint textLimit = 0, TModule* module = 0) : doc(d), index(ind), TIntLabel(parent,resourceId, textLimit, module) {} virtual int set(int i) { if ( int(*this) == i ) return i; if ( &doc != NULL ) { doc.set(index,i); } return TIntLabel::set(i); } virtual int get() const { if ( &doc != NULL ) return doc.GetData(index); return 0; } int operator=(int i) { return set(i); } }; //------------------------------------------------------------------------------ class TLaskuriDialog : public TDialog, public TView { //------------------------------------------------------------------------------ TIntLaskuri *hal; TIntLaskuri *kal; TLaskuriDocument &Docu; // Valmiiksi oikean tyyppinen synonyymi Doc:ille int suunta; public: TLaskuriDialog(TLaskuriDocument& doc, TWindow* parent = 0) : TView(doc), Docu(doc), TDialog(parent, "LASKURI") { hal = new TIntLaskuri(doc,0,this, HAL); kal = new TIntLaskuri(doc,1,this, KAL); suunta = 1; } virtual ~TLaskuriDialog() { delete kal; delete hal; } void SetupWindow() { TDialog::SetupWindow(); VnRevert(false); // Tämän jekun ansiosta lukee!!! } // Seuraavat virtuaaliset metodit pitää tehdä jotta View ikkuna toimisi static const char far* StaticName() {return "Laskuri View";} // put in resource const char far* GetViewName() { return StaticName(); } TWindow* GetWindow() { return (TWindow*)this; } bool SetDocTitle(const char far* docname, int index) { return TWindow::SetDocTitle(docname, index); } bool VnIsWindow(HWND hWnd) { return ((HWindow == hWnd) || IsChild(hWnd)); } int TeeTyhja() { *hal = 0; *kal=0; return 0; } void BNHAClicked() { *hal += suunta; } void BNKAClicked() { *kal += suunta; } void BNNollaaClicked() { TeeTyhja(); } void BNExitClicked() { CloseWindow(); } bool CanClose() { return TWindow::CanClose() && Doc->CanClose(); } void CmCut() { Docu.ToClipboard(*this); TeeTyhja(); } void CmCopy() { Docu.ToClipboard(*this); } void CmPaste() { Docu.FromClipboard(*this); } void CmDec() { TMenu menu(*Parent); suunta = -1; menu.CheckMenuItem(IDM_OPTIONS_DEC, MF_CHECKED); menu.CheckMenuItem(IDM_OPTIONS_INC, MF_UNCHECKED); } void CmInc() { TMenu menu(*Parent); suunta = 1; menu.CheckMenuItem(IDM_OPTIONS_DEC, MF_UNCHECKED); menu.CheckMenuItem(IDM_OPTIONS_INC, MF_CHECKED); } bool VnRevert(bool clear); bool VnCommit(bool force); DECLARE_RESPONSE_TABLE(TLaskuriDialog); }; //------------------------------------------------------------------------------ class TLaskuriApp : public TApplication #ifdef OWL5 , public TRecentFiles #endif { char menustr[40]; public: TLaskuriApp(const char *title,const char *menu=NULL) : TApplication(title) #ifdef OWL5 ,TRecentFiles(INIFILE, 4) #endif { kopioi_jono(N_S(menustr),menu); } void InitMainWindow() { TDecoratedFrame *fw = new TDecoratedFrame(0, Name,0); fw->SetIcon(this, "IKONI"); #ifdef OWL5 fw->SetIconSm(this, "IKONI"); #endif fw->Attr.AccelTable = "PIKA"; SetMainWindow(fw); // Laitetaan menu, jossa EI ole File-menua if ( menustr[0] ) fw->AssignMenu(menustr); // fw->SetMenuDescr(TMenuDescr(menustr,0,0,0,0,0,1)); else fw->SetMenuDescr(TMenuDescr("Paamenu",1,0,0,0,0,1)); // Asennetaan dokumentin käsittelijä SetDocManager(new TDocManager(dmSDI | dmMenu ,this)); GetMainWindow()->SetFlag(wfShrinkToClient); } void InitInstance() { TApplication::InitInstance(); GetDocManager()->CreateAnyDoc(0, dtNewDoc); // Tämän ansiosta tyhjä aluksi GetMainWindow()->SetFlag(wfShrinkToClient); } protected: void EvNewView(TView& view); void EvCloseView(TView& view); void EvOwlDocument(TDocument& doc); int32 CmFileSelected(uint wp, int32 lp); // void CmHelpAbout(); DECLARE_RESPONSE_TABLE(TLaskuriApp); }; //------------------------------------------------------------------------------ // Luodaan dokumentin käsittelijä ja annetaan sille käsiteltävä tiedostotyyppi #define LASKURIVIEW(dlg) \ DEFINE_DOC_TEMPLATE_CLASS(TLaskuriDocument, dlg, tLaskuriDocTPL); \ tLaskuriDocTPL LaskuriDoc( \ "Laskuri", "*.las", \ 0, "las", \ dtAutoDelete | dtUpdateDir ); // "Laskuri (*.las)|*.las|Teksti (*.txt)|*.txt|All Files (*.*)|*.*||", "*.*", #endif // DOCLASK_H